• MVC 控制器激活


     MVC 控制器激活

     ASP.NET MVC 控制器激活(三)

    前言

    在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstance()方法的默认实现中涉及到的一些对象类型,使用它们来进行控制器注入。

    对象模型

    图1

    如上图1,是在控制器(一)中所讲,整个的执行过程都包含在DefaultControllerFactory控制器工厂中的GetControllerInstance()方法中,我们再来看一下IControllerActivator接口类型的定义:

    复制代码
     1     public interface IControllerActivator
     2     {
     3         // 摘要:
     4         //     在类中实现时创建控制器。
     5         //
     6         // 参数:
     7         //   requestContext:
     8         //     请求上下文。
     9         //
    10         //   controllerType:
    11         //     控制器类型。
    12         //
    13         // 返回结果:
    14         //     创建的控制器。
    15         IController Create(RequestContext requestContext, Type controllerType);
    16     }
    复制代码

    会发现在里面的定义的Create()方法的签名和DefaultControllerFactory控制器工厂中的GetControllerInstance()方法签名相同,这就对了,这就是在GetControllerInstance()方法中的另一个注入点,而在框架默认的执行中,会有一个默认的实现类实现了IControllerActivator接口类型的DefaultControllerActivator类型,因为它是框架内部的,访问级别是私有的,所以我们外部是调用不了的,我们这里可以自己自定义的实现,并且注入到框架中。

    IControllerActivator类型实现的注入

    先看一下我们自定义的实现:

    复制代码
     1 using System.Web.Mvc;
     2 using Ninject;
     3 using ConsoleApplication2;
     4 
     5 namespace MvcApplication.CustomControllerActivator
     6 {
     7     public class NinjectControllerActivator:IControllerActivator
     8     {
     9 
    10         private IKernel _NinjectKernel;
    11 
    12         public NinjectControllerActivator()
    13         {
    14             _NinjectKernel = new StandardKernel();
    15             _NinjectKernel.Bind<IDataStandard>().To<DataProvide>();
    16         }
    17 
    18         public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
    19         {
    20             IController controller = _NinjectKernel.Get(controllerType) as IController;
    21             if (controller != null)
    22             {
    23                 return controller;
    24             }
    25             return null;
    26         }
    27     }
    复制代码

    实现的方式和上一篇中的几乎相同,现在只要在框架初始化的时候把它的实例注册到框架中就可以了。还是再Global.asax中的Application_Start()方法中来注册:

    1 DefaultControllerFactory defaultControllerFactory =
    2                 new DefaultControllerFactory(new CustomControllerActivator.NinjectControllerActivator());
    3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);

    这里要说的是DefaultControllerFactory类型的构造函数重载中,如果我们传入了自定义的IControllerActivator类型则会运行我们的,如果没有则框架会使用默认的实现类型。也可以修改我们上一篇中定义的自定义控制器工厂,这里就不作过多的解释了。

    在图1可以清楚的看到DefaultControllerActivator类型的内部实现,在控制器(一)一文中有描述,其中还有IDependencyResolver类型的实现类可以来实现控制器的注入,方式和上述的几乎相近。区别就是在于IDependencyResolver类型实现的注入是可以面向全局的,这是框架提供给我们的便捷。

    到这里控制器的激活以及控制器的动态注入都讲解完毕了,下篇进入过MVC滤器系列。

  • 相关阅读:
    阅读笔记十四
    惨淡的蓝桥杯国赛经历
    阅读笔记十三
    阅读笔记十二
    阅读笔记十一
    阅读笔记十
    阅读笔记九
    阅读笔记八
    阅读笔记七
    阅读笔记六
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3785449.html
Copyright © 2020-2023  润新知