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

前言

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

对象模型

图1

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 using System.Web.Mvc;
 using Ninject;
 using ConsoleApplication2;
 
 namespace MvcApplication.CustomControllerActivator
 6 {
 7     public class NinjectControllerActivator:IControllerActivator
 8     {
 
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
2
3
1 DefaultControllerFactory defaultControllerFactory =
2                 new DefaultControllerFactory(new CustomControllerActivator.NinjectControllerActivator());
3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);

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

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

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

本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1425580,如需转载请自行联系原作者

ASP.NET MVC 控制器激活(三)相关推荐

  1. ASP.NET MVC 控制器激活(一)

    ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...

  2. ASP.NET MVC 控制器激活(二)

    ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...

  3. ASP.NET MVC Controller激活系统详解:默认实现

    Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前Cont ...

  4. 使用jQuery.Ajax向ASP.NET MVC控制器Post数据

    jQuery自带了Ajax的函数,你可以使用它从远程服务器下载网页,但问题是,大部分Ajax都是通过GET这种方式与远程服务器交互的. 但如果你想通过Ajax向远程服务器传递数据呢?当然jQuery. ...

  5. Asp.Net MVC控制器、控制器动作和动作结果

    原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...

  6. 精通ASP.NET MVC ——控制器可扩展性

    MVC中引导动作方法执行过程的请求流程管道中,有两个重要的部件:控制器工厂(Controller Factory) 和 动作调用器(Action Invoker).控制器工厂负责创建对请求进行服务的控 ...

  7. 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例 【转】

    一.摘要 一个Url请求经过了Routing处理后会调用Controller的Action方法. 中间的过程是怎样的? Action方法中返回ActionResult对象后,如何到达View的? 本文 ...

  8. asp.net MVC控制器中返回JSON格式的数据时提示下载

    Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...

  9. 精通ASP.NET MVC——控制器和动作

    在MVC框架中,控制器必须实现System.Web.Mvc命名空间的IController接口,如下图所示: //// 摘要:// 定义控制器所需的方法.public interface IContr ...

最新文章

  1. COM 组件设计与应用(六)——用 ATL 写第一个组件(vc.net)
  2. 离散数学及其应用傅彦pdf_《离散数学及其应用》第一章 计算机课题
  3. 文件夹和文件的名称变成蓝色
  4. 浅析STM32之usbh_def.H
  5. PowerDesigner--comment和name互相复制
  6. [转载] python程序所需的图片通过base64编码成字符串放在代码中
  7. SQL Server 按某一字段分组取最大(小)值所在行的数据
  8. 游戏开发要掌握的数学物理知识
  9. 危险漫步_2006年糖尿病漫步-漫步之日
  10. 超声B mode聚焦成像仿真(ultrasound B mode fcous imaging simulation)
  11. Vue中wangeditor工具栏失效问题
  12. macOS Monterey 12.3 (21E230) 正式版 ISO、IPSW、PKG 下载
  13. 经典的搞笑反转段子,真是笑死人不偿命
  14. 日语口语1.13 ジェトロの山本さんから部長のことをお伺いまして
  15. 虚拟机DEDECMS织梦建站
  16. docker 简单教程
  17. delphi 企业微信消息机器人_消息通知支持企业微信、钉钉机器人,MeterSphere v1.4.0发布...
  18. 一个PDF免费转WORD的网站,亲测,好用!
  19. 1000瓶子10小白鼠找毒药问题
  20. python 儿童 游戏_python程序:两个小孩玩剪刀石头布游戏,一人十分,赢一次得一分,输一次减一分,平手不扣分,当没...

热门文章

  1. spring源码核心:DefaultListableBeanFactory
  2. echarts js 删除框选数据_ECharts进行区域选择
  3. 编写python代码估算sin(x)的值
  4. Socket 实例之透析java,C#的互操作
  5. linux 循环显示所有的sh.*文件.,利用shell脚本遍历文件夹内所有的文件并作整理统计的方法...
  6. 基姆拉尔森计算公式(算任意日期是星期几)
  7. Python标准库中的glob
  8. Python类对象的运算符add重载
  9. Spring Cloud的Eureka Server(注册中心)在程序启动的时候报错:Cannot execute request on any known server
  10. 在ibatis中做等值判断(if-else)