为什么我的依赖关系没有注入?

时间:2014-05-13 15:18:36

标签: c# dependency-injection asp.net-mvc-5 unity-container

我有一个简单的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.

有人可以提出我可能错过的内容吗?

2 个答案:

答案 0 :(得分:2)

我认为以下是覆盖依赖项解析程序的正确方法。

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

我建议你使用mvc unity bootstrapper而不是nuget的unity package。 Bootsrapper配有基本设置。

答案 1 :(得分:0)

读取错误:没有为此对象定义无参数构造函数。我没有看到ToDoList,但假设它是无参数的,所以这不是问题。那么问题是ToDoRepository有一个参数,但是没有提供。 Unity并没有通过提供它来解决问题。

@Qamar似乎有一个修复。您还可以确保解析ToDoList依赖关系并将其传递给代码中已解析的ToDoRepository。这取决于你想要给管道连接多少以及多少魔法。

我喜欢@ Qamar关于Bootstrapper的提示。需要研究一下。