asp.net-mvc-5 - ASP.NET-MVC-5 依赖注入
问题描述
我是 mvc 5 依赖注入的新手,我知道 mvc 5 有一个默认的无参数构造函数。但是在依赖注入中,我们创建一个带参数的构造函数,而 IOC 容器为参数提供对象。我的问题是 IOC 容器如何像 unity 一样让 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 需要创建控制器时,它将能够构建具有所有依赖项的控制器。
推荐阅读
- reactjs - 使用 React/Typescript 绘制 d3 轴
- git - Git克隆卡在接收对象上
- python - 如何在 wordpress 中的站点内显示 django 应用程序
- r - mvtnorm::pmvnorm 的 Rcpp 实现比原始 R 函数慢
- javascript - 2个组件之间的通信
- c - 为什么这个程序不能在 C 中工作?
- spring-boot - Spring Boot 云 GCP 无法连接到本地 Google PubSub 模拟器
- angular - Ionic 3 - ngFor 第二次访问中的数据空白
- javascript - Laravel:尝试在视图模板中访问数组内的值
- java - 在 LifecycleObserver 中调用 mainActivity 的方法