zoukankan      html  css  js  c++  java
  • 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滤器系列。

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3785449.html
Copyright © 2011-2022 走看看