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

前言

在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅所留的疑问将会在这部分里解决掉。

对于控制器激活的总结

总的来说控制器的激活过程有这么几个步骤(部分):

1.根据当前路由信息获取控制器名称

2.获取当前系统的控制器工厂(用来生成控制器)

2.1   据控制器名称生成和当前系统的请求上下文参数生成控制器类型(Type

2.1.1 根据当前的路由信息判断选择控制器所在命名空间

2.1.2 返回控制器类型(Type)

2.2   根据控制器类型(Type)请求上下文参数生成控制器类型(IController)

2.3    返回控制器类型(IController)

3.获取由控制器工厂生成的控制器(IController)

4.执行IController.Execute()

控制器的由来

前面都有讲到MVC的入口在Module中,具体是在注册路由的时候,默认的注册MvcHandler作为请求处理类型,而控制器的就是在这里生产出来的,为什么说是生产?因为系统预先实现了一个控制器工厂类DefaultControllerFactory(如下的代码结构),在控制器生成到执行的这个过程里涉及到众多的类型和控制器的对象模型,这些内容在后面篇幅会一一讲解。

DefaultControllerFactory类型的结构:

 1     public class DefaultControllerFactory : IControllerFactory2     {3         public DefaultControllerFactory();4         public DefaultControllerFactory(IControllerActivator controllerActivator);5 6         public virtual IController CreateController(RequestContext requestContext, string controllerName);7         protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType);8         protected internal virtual SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType);9         protected internal virtual Type GetControllerType(RequestContext requestContext, string controllerName);
10         public virtual void ReleaseController(IController controller);
11     }

本篇先将上面总结中的2.1.2之前的部分粗略的讲解一下,请先看如下图:

如上图,这里先要说的是控制器类型缓存对象ControllerTypeCache,ControllerTypeCache加载所有实现了IController接口的公共类并缓存在MVC-ControllerTypeCache.xml文件里。当然了这些都是框架所做的,我们只需了解一下,学习其中的思想就行了。

在请求到达默认请求处理程序的时候,由默认的控制器工厂DefaultControllerFactory来根据RouteData的DataToken【NameSpaces】里的定义的命名空间和Values【controller】的控制器名称来进行判断,具体怎么判断的是由ControllerTypeCache对象来查询匹配的。

先根据控制器名称查询缓存中是否有对应此名称的控制器,如果有则存放在 ILookup<string, Type>类型对象中,然后根据RouteData的DataToken【NameSpaces】里的定义的命名空间来和ILookup<string, Type>对象中的控制器类型所在命名空间进行比对,如果是相同的则添加此类型到返回集合,如果不相同则继续用RouteData的DataToken【NameSpaces】剩下的命名空间值挨个的进行比对。

根据返回的类型集合,如果总数为0返回空,总数为1返回此集合中的类型,如果大于1则会引发CreateAmbiguousControllerException类型的异常。

在此时DefaultControllerFactory中已经获取到了控制器类型(Type)。

在总结中2.2所指部分为IControllerActivator接口类型的实现。

 1     // 摘要:2     //     对使用依赖项注入实例化控制器的方式进行精细控制。3     public interface IControllerActivator4     {5         // 摘要:6         //     在类中实现时创建控制器。7         //8         // 参数:9         //   requestContext:
10         //     请求上下文。
11         //
12         //   controllerType:
13         //     控制器类型。
14         //
15         // 返回结果:
16         //     创建的控制器。
17         IController Create(RequestContext requestContext, Type controllerType);

这部分的实现,可以注入到控制器工厂,而实现的内部依然有可扩展注入的地方,在MVC框架中有默认的实现,我们先来看一下2.2部分之后的实现概念图:

获取到了Controller的Type过后,DefaultControllerFactory就可以根据Type来创建Controller,然而在MVC框架的设计中,【根据ControllerType创建Controller的方式】是不会放在DefaultControllerFactory中的,而是通过MVC框架中实现了IControllerActivator接口类型的默认实现类DefaultControllerActivator类型来进行创建IController的,而在DefaultControllerActivator中又是通过DependencyResolver类型来创建一个IDependencyResolver接口的默认实现类来实现的。

在IDependencyResolver接口中,有个GetService()方法,这个方法就是最终要创建类型所用到的方式,也可以自定义来实现,这也是扩展点之一。说回接口类型,MVC中有个默认的实现了IDependencyResolver接口的类型DefaultDependencyResolver,在DefaultDependencyResolver类型中GetService()方法的默认实现方式Activator.CreateInstance(serviceType);也就是正常通过反射来创建类型的。

看一下由Handler到Icontroller的一个过程图:

上面的这些以及前面篇幅所讲,都是MVC默认实现的方式,每个部分都可以自定义来扩展,MvcHandler、DefaultControllerFactory、DefaultDependencyResolver等等这些类型。

会在后面的篇幅中说明在激活控制器的过程中所有可注入扩展点的。

转载于:https://blog.51cto.com/jinyuan/1424789

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

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

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

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

    ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstanc ...

  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控制器中返回JSON格式的数据时提示下载

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

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

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

  9. ASP.NET MVC控制器获取前端视图FORM表单的方法

    <div> <input type="text" name="username"/> <input type="text ...

最新文章

  1. 95后架构师晒出工资单:狠补了这个,真香...
  2. DB2 创建数据库、缓冲池和表空间
  3. HDOJ 3966 Aragorn#39;s Story
  4. 缓冲区溢出_了解Java缓冲池
  5. Softer-NMS:CMU旷视最新论文提出定位更加精确的目标检测算法
  6. tensorflow sigmoid_cross_entropy_with_logits 函数解释
  7. 一个有趣的观察:关于内向和外向
  8. C语言字符串中删除重复的字符的算法(附完整源码)
  9. Vue(二十一)使用express模拟接口数据
  10. 如何自己找出SMBDA服务使用的端口号
  11. maven tomcat1.7环境下构建javaweb 项目
  12. vue-video-player修改src就会报错_4、修改入口点代码
  13. 苹果cms仿ZzzFun动漫视频站PC模板
  14. 朗锐智科发布PCIe-3504PoE 千兆以太网图像采集卡
  15. 左室短轴切面_【图】短轴超声切面 - 心脏解剖学 - 天山医学院
  16. 使用git遇到的问题汇总
  17. mysql中regexp用法_MySQL中REGEXP正则表达式使用大全
  18. 南航大学计算机专业硕士学历,南航计算机科学与技术学院导师介绍:戴群
  19. Lumion和Enscape渲染器有什么区别?哪个适合你
  20. cisco ASA 防火墙安全算法原理和基本配置(转自http://xiaoxiao1001.blog.51cto.com/7640562/1300161)

热门文章

  1. 关于网易云音乐爬虫的api接口?
  2. git常用命令速查表【转】
  3. Docker集群管理工具-Kubernetes部署记录
  4. 在LNMP下用nginx 1.4.7配置nagios监控
  5. 《DBA修炼之道:数据库管理员的第一本书》——1.4节评估DBA的工作邀请
  6. Mysql Cluster节点类型
  7. 对比MySQL表数据内容方式汇总
  8. 解决打包软链接打包失败问题
  9. python模块导入
  10. python-列表生成器