ASP.NET-MVC-5 依赖注入
ASP.NET-MVC-5 dependency Injection
我是 mvc 5 依赖注入的新手,我知道 mvc 5 有一个默认的无参数 constructor.But 在依赖注入中我们创建一个带有参数的构造函数,IOC 容器向 parameter.my 问题是像 unity 这样的 IOC 容器如何让 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 需要创建控制器时,它将能够构建包含所有依赖项的控制器。
我是 mvc 5 依赖注入的新手,我知道 mvc 5 有一个默认的无参数 constructor.But 在依赖注入中我们创建一个带有参数的构造函数,IOC 容器向 parameter.my 问题是像 unity 这样的 IOC 容器如何让 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 需要创建控制器时,它将能够构建包含所有依赖项的控制器。