为什么我的依赖没有被注入
本文关键字:注入 我的依赖 为什么 | 更新日期: 2023-09-27 18:03:21
我有一个简单的MVC5应用程序。我想注入一个存储库到我的控制器之一。
控制器看起来像这样…
public class HomeController : Controller
{
IToDoRepository repo;
public HomeController(IToDoRepository repo)
{
this.repo = repo;
}
// Methods ...
}
My Repository是这样的…
public class ToDoRepository : IToDoRepository
{
ToDoListData data;
public ToDoRepository(ToDoListData dataSource)
{
this.data = dataSource;
}
// Blah...
}
ToDoListData
只是一个像这样定义的虚拟数据源…
public class ToDoListData : List<ToDoItem>
{
public ToDoListData()
{
Add(new ToDoItem { Id = 1, Title = "Do Shopping" });
Add(new ToDoItem { Id = 2, Title = "Feed Dogs", Complete = true });
Add(new ToDoItem { Id = 3, Title = "Pay Gas Bill" });
}
}
使用nuget,我添加了Unity。Mvc5包。项目中安装的包的总列表是…
<packages>
<package id="Antlr" version="3.4.1.9004" targetFramework="net45" />
<package id="bootstrap" version="3.0.0" targetFramework="net45" />
<package id="jQuery" version="1.10.2" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.HelpPage" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Modernizr" version="2.6.2" targetFramework="net45" />
<package id="Newtonsoft.Json" version="5.0.6" targetFramework="net45" />
<package id="Respond" version="1.2.0" targetFramework="net45" />
<package id="Unity" version="3.0.1304.1" targetFramework="net45" />
<package id="Unity.Mvc5" version="1.1" targetFramework="net45" />
<package id="Unity.WebAPI" version="5.1" targetFramework="net45" />
<package id="WebGrease" version="1.5.2" targetFramework="net45" />
</packages>
我更新了全局。调用UnityConfig.RegisterComponents()
并修改该方法,如下所示:
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<IToDoRepository, ToDoRepository>(
new ContainerControlledLifetimeManager());
container.RegisterType<ToDoListData, ToDoListData>(
new ContainerControlledLifetimeManager());
GlobalConfiguration.Configuration.DependencyResolver =
new UnityDependencyResolver(container);
}
}
现在,我对这个比较陌生,但是我读到的建议(或者至少我糊涂的大脑似乎认为它建议),这应该运行。
然而。启动站点返回..
System.MissingMethodException: No parameterless constructor defined for this object.
谁能告诉我我可能错过了什么?
我认为下面是覆盖依赖解析器的正确方法。
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
我建议你使用mvc unity bootstrapper而不是nuget的unity包。Bootsrapper自带基本设置
读取错误:没有为这个对象定义无参数构造函数。我没有看到ToDoList,但假设它是无参数的,所以这不是问题。问题是ToDoRepository有一个参数,但是没有提供。Unity并没有通过提供它来解决这个问题。
@Qamar似乎有一个修复。您还可以确保对ToDoList依赖项进行了解析,并将其传递给代码中解析过的ToDoRepository。这取决于你有多想把管道连接起来,有多神奇。
我喜欢@Qamar关于Bootstrapper的建议。需要调查一下