首页 > 解决方案 > ASP.NET-MVC-5 依赖注入

问题描述

我是 mvc 5 依赖注入的新手,我知道 mvc 5 有一个默认的无参数构造函数。但是在依赖注入中,我们创建一个带参数的构造函数,而 IOC 容器为参数提供对象。我的问题是 IOC 容器如何像 unity 一样让 mvc 5 理解带参数的构造函数

标签: asp.net-mvc-5

解决方案


它的基本工作方式是向 IoC 容器询问类型(“resolve”),它将使用反射来查找构造函数(对于 Unity,如果它们是多个构造函数,则参数最多的那个)。然后它将为每个参数类型本身重复该过程,就像一棵树一直沿着依赖图向下。Unity 将能够自动创建具体类型的实例,但如果构造函数使用接口或抽象类型,那么它需要知道要使用哪个实现,因此在这些情况下,您需要预先注册类型:

登记:

例如container.RegisterType<IUserHelper, UserHelper>();

解决:

例如container.Resolve<IUserHelper>();

IOC 容器不适用于开箱即用的 MVC,但存在额外的库,例如 Unity.MVC5,它与 MVC 管道挂钩,因此当 MVC 尝试创建控制器时,它使用 IoC 容器而不是直接更新控制器(这将除非它是无参数的否则失败)。

这是一个例子:

public class MyController(IUserHelper userHelper, IRepository repository) : Controller

然后我们可以:

public class MyRepository(IDbContext dbContext) : IRepository

public class  MyDbContext () : IDbContext

如果我们使用 RegisterType 注册 IUserHelper、IRepository 和 IDbContext,那么当 MVC 需要创建控制器时,它将能够构建具有所有依赖项的控制器。


推荐阅读