为什么我的依赖没有被注入

本文关键字:注入 我的依赖 为什么 | 更新日期: 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的建议。需要调查一下