• 在ASP.NET MVC中使用Unity进行依赖注入的三种方式


    在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller依赖于ModelRepository的抽象而不是它的实现。

    我们可以在三个阶段使用IoC实现上面所说的解耦操作,首先需要简单介绍一下默认情况下Controller的激活过程:

    1、用户发送请求黑ASP.NET,路由系统对请求进行解析,根据注册的路由规则对请求进行匹配,解析出Controller和Action的名称等信息。

    2、将解析出的信息交给一个MvcRouteHandler对象进行处理,MvcHttpHandler中存在以个ControllerFactory成员,如果构造函数中没有提供一个实现IControllerFactory接口的对象,则默认构造函数通过调用ControllerBuilder.Current.GetControllerFactory()获取一个这样的对象。

    3、系统调用上文对象中德GetHttpHandler获得了一个实现了IHttpHandler接口的MvcHandler对象最终处理请求。

    4、在 MvcHandler中调用BeginProcessRequest方法继续处理请求,方法中从1中解析的信息中获得Controller和Action 的信息,而后利用2种的IControllerFactory对象激活Controller对象,并最终执行相应的Action。

    第一种方法

    由上文2种可知,我们可以创建自己的IControllerFactory对象实现依赖注入,然而我们可以通过直接继承 DefaultControllerFactory并重写GetControllerInstance方法来实现,这样可以免去重新实现其他一些功能的工作。

    以下是使用Unity创建的继承自DefaultControllerFactory的UnityControllerFactory的简单示例:

     1 namespace UnitySample
     2 
     3 {
     4 
     5 public class UnityControllerFactory:DefaultControllerFactory
     6 
     7 {
     8 
     9 private IUnityContainer container;
    10 
    11 public UnityControllerFactory(IUnityContainer container)
    12 
    13 {
    14 
    15 this.container = container;
    16 
    17 }
    18 
    19 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    20 
    21 {
    22 
    23 return null == controllerType ? null : (IController)this.container.Resolve(controllerType);
    24 
    25 //return base.GetControllerInstance(requestContext, controllerType);
    26 
    27 }
    28 
    29 }
    30 
    31 }

    我们可以在App_Start中使用ControllerBuilder设置系统使用这个ControllerFactory

    1 IUnityContainer container = new UnityContainer();
    2 
    3 container.RegisterType();
    4 
    5 UnityControllerFactory factory = new UnityControllerFactory(container);
    6 
    7 ControllerBuilder.Current.SetControllerFactory(factory);

    第二种方法

    上文中继承的DefaultControllerFactory中,使用一个ControllerActivator的成员来实现对 Controller的激活,如果创建对象中没有提供一个IControllerActivator对象,则提供一个默认实现了 IControllerActivator的DefaultControllerActivator对象这个类型,这个接口中存在用于创建 Controller对象的Create方法,在DefaultControllerFactory中有存在一个 IControllerActivator类型的构造方法来制定它。所以我们可以使用一个自定义的实现自IControllerActivator借口的对象来进行依赖注入。

     1 namespace UnitySample
     2 
     3 {
     4 
     5 public class UnityControllerActivator:IControllerActivator
     6 
     7 {
     8 
     9 private IUnityContainer container;
    10 
    11 public UnityControllerActivator(IUnityContainer container)
    12 
    13 {
    14 
    15 this.container = container;
    16 
    17 }
    18 
    19 public IController Create(RequestContext requestContext, Type controllerType)
    20 
    21 {
    22 
    23 return controllerType == null ? null : (IController)container.RegisterType(controllerType);
    24 
    25 }
    26 
    27 }
    28 
    29 }

    修改方法1中在App_Start中的代码,使用这个ControllerActivator:

     1 IUnityContainer container = new UnityContainer();
     2 
     3 container.RegisterType();
     4 
     5 //UnityControllerFactory factory = new UnityControllerFactory(container);
     6 
     7 IControllerActivator controllerActivator = new UnityControllerActivator(container);
     8 
     9 DefaultControllerFactory defaultFactory = new DefaultControllerFactory(controllerActivator);
    10 
    11 ControllerBuilder.Current.SetControllerFactory(defaultFactory);

    第三种方法

    如同DefaultControllerFactory类中一样,在DefaultControllerActivator中也存在一个包含一个参数(类型为IDependencyResolver)的构造方法和一个没有参数的构造方法,默认情况下DefaultControlerFactory使用无参构造函数实例化一个DefaultControllerActivator对象,这种情况下提供一个默认的IDependencyResolver 对象。所以我们就同样可以使用一个自定义的IDependencyResolver类实现依赖注入。在IDependencyResolver接口中存在方法GetService和GetServices来对具体的类型进行解析

     1 namespace UnitySample
     2 
     3 {
     4 
     5 public class UnityDependencyResolver:IDependencyResolver
     6 
     7 {
     8 
     9 private IUnityContainer container;
    10 
    11 public UnityDependencyResolver(IUnityContainer container)
    12 
    13 {
    14 
    15 this.container = container;
    16 
    17 }
    18 
    19 public object GetService(Type serviceType)
    20 
    21 {
    22 
    23 return container.Resolve(serviceType);
    24 
    25 }
    26 
    27 public IEnumerable<object>GetServices(Type serviceType)
    28 
    29 {
    30 
    31 return container.ResolveAll(serviceType);
    32 
    33 }
    34 
    35 }
    36 
    37 }

    修改App_Strat中的方法,使用这个自定义的DependencyResolver:

    1 IUnityContainer container=new UnityContainer();
    2 
    3 container.Register Type<IXXXRepository,XXXRepository>();
    4 
    5 UnityDependencyResolver resolver=new UnityDependencyResolver(container);
    6 
    7 DependencyResolver.SetResolver(resolver)
  • 相关阅读:
    多层级makefile
    vscode常用快捷键
    unix socket接口
    以太网复习
    shell脚本算术运算
    1185: 零起点学算法92——单词数(C)
    1183: 零起点学算法90——海选女主角(C语言)
    1181: 零起点学算法88——偶数求和(C语言)
    1144: 零起点学算法51——数组中删数(C语言)
    列主元消去法&全主元消去法——Java实现
  • 原文地址:https://www.cnblogs.com/leleroyn/p/4435569.html
Copyright © 2020-2023  润新知