我有一个简单的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>
我更新了Global.asax以调用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.
有人可以提出我可能错过的内容吗?
答案 0 :(得分:2)
我认为以下是覆盖依赖项解析程序的正确方法。
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
我建议你使用mvc unity bootstrapper而不是nuget的unity package。 Bootsrapper配有基本设置。
答案 1 :(得分:0)
读取错误:没有为此对象定义无参数构造函数。我没有看到ToDoList,但假设它是无参数的,所以这不是问题。那么问题是ToDoRepository有一个参数,但是没有提供。 Unity并没有通过提供它来解决问题。
@Qamar似乎有一个修复。您还可以确保解析ToDoList依赖关系并将其传递给代码中已解析的ToDoRepository。这取决于你想要给管道连接多少以及多少魔法。
我喜欢@ Qamar关于Bootstrapper的提示。需要研究一下。