控制器的激活默认情况下使用反射来实现的,这其中采用了DI,单例等设计模式。对于控制器的主要涉及到如下的类:
ControllerBuilder、DefaultControllerFactory、DefaultControllerActivator(实现了IControllerActivator接口)、DependencyResolver(并没有实现IDependencyResolver,但是有这个接口对象实例)、DefaultDependencyResolver(实现了IDependencyResolver接口,默认采用此类来解析控制器对象)

如上的几个类是控制器激活最重要的类。大概说说过程,备忘,当然也说不了多具体,有个大概思路就好,网上已经很多介绍的文章了。DefaultControllerFactory并不是构造控制器的地方,控制器的构造实在ControllerBuilder中,具体涉及到SetControllerFactory以及GetControllerFactory两个方法,我们可以通过SetControllerFactory来拓展自己的IOC容器,这是第一个可供拓展点。
DefaultControllerActivator类用来激活控制器,我们一般创建自己的MVC框架的时候,都是在这个类实现的ICOntrollerActivator接口的Create方法中,通过获取的控制器对象使用反射来创建控制器实例。当然这是在我们自己创建自己的MVC框架以及不使用第三方IOC容器的时候,就是使用该方法来创建的,而在MVC框架中,控制器实例的创建是延迟到了efaultDependencyResolver类中。这也是第二个可拓展的地方,我们可以在第三方IOC容器中,实现IControllerActivator接口来创建控制器对象。
DefaultDependencyResolver类实现了IDependencyResolver接口,默认的MVC框架实现的IOC容器(基于DI模式)设计的容器。我们就是在这里构造了我们的IOC容器,不过通过阅读源码你会发现,该IOC容器源码其实就是默认使用反射来创建控制器对象。这与上面的DefaultControllerActivator类的作用是一样的。可以参考源码:

public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
catch (Exception ex)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
MvcResources.DefaultControllerFactory_ErrorCreatingController,
controllerType),
ex);
}
}

可以看到上面的try语句里面的代码,通过调用GetService()方法,默认使用MVC自己的IOC容器(即DefaultDependencyResolver类)。在这里我们可以基于第三方的IOC来拓展我们自己的设计逻辑,这也是第三个可拓展点。

<<asp.net mvc5框架揭秘>>一书中详细说了三个可拓展的地方就是如上的描述。上面的描述就是我自己看源码以及资料的一个总结,当你看MVC源码的时候,你会有自己的收获,我也没有全部铺开来,仅仅就是自己的心得笔记。

asp.net mvc控制器激活全分析的更多相关文章

  1. 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

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

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

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

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

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

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

  5. MVC 控制器激活

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

  6. 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器

    MVC全称是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑和数据显示分离的方法组织代码,将 ...

  7. Asp.Net MVC 控制器

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

  8. 详解ASP.NET MVC 控制器

    1   概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由  一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...

  9. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. unix下快速混淆源代码

    只能算雕虫小技,但可以快速简单的做混淆,如下: #vapyhqr <fgqvb.u> #vapyhqr <fgqyvo.u> #vapyhqr <fgqobby.u> ...

  2. UNIX网络编程——非阻塞connect

    当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行.我们接着使用select检测这个连接或成功或失败的已建 ...

  3. Java并发——线程池原理

    "池"技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实 ...

  4. python类:描述器Descriptors和元类MetaClasses

    http://blog.csdn.net/pipisorry/article/details/50444769 描述器(Descriptors) 描述器决定了对象属性是如何被访问的.描述器的作用是定制 ...

  5. EBS DBA指南笔记(一)

    第一章  ORACLE APPLICATIONS 的组件与架构 1.ebs组件的几大构成:客户端,form server,web server,concurrent processor,数据库.每个组 ...

  6. Leetcode_6_ZigZag Conversion

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41408021 看完这篇文章,你可能会学到到知识如下: (1 ...

  7. JAVA应用程序转换为Applet

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41673295 将一个图形的JAVA应用程序转换为能够嵌入在 ...

  8. 使用Libgdx开发的FlappyBird(像素鸟、疯狂的小鸟)游戏源码

    本帖最后由 宋志辉 于 2014-10-21 15:06 编辑 点击进入下载地址 Flappy Bird(飞扬的小鸟)由一位来自越南河内的独立游戏开发者阮哈东开发,是一款形式简易但难度极高的休闲游戏. ...

  9. IE11开发人员工具 js脚本debugger调试

    微软在浏览器IE11中对F12开发人员工具的UI进行了彻底的换脸,虽然有诸多的不习惯但也是有方便之处的,比如我们用到的最多的断点调试,在F12调试状态下会加载出页面的js脚本文件,而需要对某个文件中的 ...

  10. 网站开发进阶(二十九)HTML特殊转义字符

    HTML特殊转义字符 参考文献 http://tool.oschina.net/commons?type=2 美文美图