DefaultControllerFactory 是MVC默认的Controller查找和激活工厂类
我们可以通过自定义ControllerFactory替换DefaultControllerFactory类来实现IOC的引入

public class DefaultControllerFactory : IControllerFactory
{
    //其他成员
    public DefaultControllerFactory();
    public DefaultControllerFactory(IControllerActivator controllerActivator);

}
public interface IControllerActivator//Controller激活器接口
{
     IController Create(RequestContext requestContext, Type controllerType);
}

//此类是DefaultControllerFactory的私有内部类,调用DefaultControllerFactory的默认构造函数或者IControllerActivator参数为null时,默认使用此内部类来激活Controller
private class DefaultControllerActivator : IControllerActivator
{
     private Func<IDependencyResolver> _resolverThunk;用来返回IDependencyResolver实现类的实例
     public DefaultControllerActivator();
    public DefaultControllerActivator(IDependencyResolver resolver);
    public IController Create(RequestContext requestContext,  Type controllerType);
}

//用来获取Controller对象的
public interface IDependencyResolver
{
     object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
}

//此类是用来封装管理IDependencyResolver类的实现类的。
public class DependencyResolver
{
     private static DependencyResolver _instance;
    public void InnerSetResolver(object commonServiceLocator);
    public void InnerSetResolver(IDependencyResolver resolver);
     public void InnerSetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);
     public static void SetResolver(object commonServiceLocator);
    public static void SetResolver(IDependencyResolver resolver);
     public static void SetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);
    public static IDependencyResolver Current { get; }
     public IDependencyResolver InnerCurrent { get; }
}
类关系图(图片引用自蒋金楠老师的博客):

总结:实例化DefaultControllerFactory类,如果IControllerActivator参数等于null或者没有传入参数,则DefaultControllerFactory类就会创建一个内部私有IControllerActivator接口实现类(DefaultControllerActivator)的实例

用来激活Controller类,而DefaultControllerActivator类会先判断内部私有委托resolverThunk是否为空,如果为空就返回DependencyResolver.Current静态属性下的IDependencyResolver实现类的实例,用来真正的创建激活

Controller类;如果不为空,就执行这个委托获得IDependencyResolver实现类的实例来激活Controller。(MVC默认是通过反射来激活Controller的)

Asp.net MVC的Controller激活理解【学习笔记】的更多相关文章

  1. 《ASP.NET MVC 5 高级编程》学习笔记

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

  2. 基于ASP.NET MVC的ABP框架入门学习教程

    为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加, ...

  3. Asp.net MVC 中Controller返回值类型ActionResult

    [Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...

  4. 返璞归真 asp.net mvc (3) - Controller/Action

    原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...

  5. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  6. ASP.NET MVC控制器Controller中参数

    前述文章参见:ASP.NET MVC控制器Controller 绪论 之前的控制器返回的均为常量字符串,接下来展示如何获取请求传来的参数,而返回"动态"的字符串. 可以在操作方法B ...

  7. 【部分】ASP.NET MVC的Controller接收输入详解

    原文:https://blog.csdn.net/lxrj2008/article/details/79455360 ASP.NET mvc的Controller要正确的响应用户发出的请求就要获取到用 ...

  8. spring mvc 及NUI前端框架学习笔记

    spring mvc 及NUI前端框架学习笔记 页面传值 一.同一页面 直接通过$J.getbyName("id").setValue(id); Set值即可 二.跳转页面(bus ...

  9. 《ASP.NET4从入门到精通》学习笔记2

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/dongdongdongJL/article/details/37610807   <ASP.N ...

随机推荐

  1. RFC 文档(中文与英文)

    http://man.chinaunix.net/develop/rfc/default.htm https://www.rfc-editor.org/retrieve/ http://www.iet ...

  2. android开发的学习路线

    参考资料:千锋3G学院--课程大纲    http://www.mobiletrain.org 看了专业的培训机构的课程大纲,才知道,自己学习android的路途才刚刚开始!特此整理分享一下,希望能帮 ...

  3. C# FileSystemWatcher 监视磁盘文件变更

    简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数据库. 原需求:原先的需求是这样的:有一台PDA扫码枪,一个 ...

  4. JavaScript的DOM操作(三)

    1.相关元素操作: var a = document.getElementById("id"); var b = a.nextSibling,找a的下一个同辈元素,注意空格 var ...

  5. Android studio错误及解决办法

    错误: Cannot launch AVD in emulator. Output: emulator: ERROR: GPU emulation is disabled. Only screen s ...

  6. burp

    http://www.2cto.com/Article/201406/310929.html

  7. Entity Framework Demo(一) 简单搭建环境

    Entity Framwork(实体框架,简称EF)是ORM(Object Relational Mapping,对象映射关系)的一个解决方案. EF允许项目将数据库的表映射为实体,并封装了操作方法, ...

  8. 研究WCF并发及处理能力的控制

    WCF 跟并发 性能相关的几个配置:1.系统控制的客户端网络连接并发(如果服务端也需要并发请求的话这个参数也是需要的):          <configuration>          ...

  9. Script: Who’s using a database link?(找出谁在使用dblink)

    Every once in awhile it is useful to find out which sessions are using a database link in an Oracle ...

  10. node exports和module.exports区别

    我们只需知道三点即可知道 exports 和 module.exports 的区别了: exports 是指向的 module.exports 的引用 module.exports 初始值为一个空对象 ...