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. IOS开发之网络开发工具

    IOS开发之网络开发工具 做移动端开发  常常会涉及到几个模块:1.网络检測   2.网络请求get和post请求  3.文件上传  4.文件下载   5.断点续传 如今将这些一一分享给大家 ,也欢迎 ...

  2. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

  3. myeclipse设置技巧

    如何设置jsp的默认打开为MyEclipse JSP Editor? windows -> General -> Editor - > File Associations 选择 *. ...

  4. session原理解析

    cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案: 由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于c ...

  5. PS之火焰铁锈字

    效果图 素材一:将下图在PS中打开,选择菜单:编辑>定义图案,命名后关闭图案 素材二 1.新建如下画布 2.将素材二拖入新建好的画布(使用移动工具) 3.先将文字图层复制4次(ctrl+J)并且 ...

  6. tomcat中jsp编译

    tomcat运行的工程中,jsp替换文件后可能不起作用.原因是jsp也是需要编译的.编译后的文件存放在tomcat/work文件夹下.如果替换不起作用,可以将work文件夹下的内容删除掉,重新启tom ...

  7. div a块状布局

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. android 微信分享没反应问题总结

     一.废话 我必须说我再这个上面吃了很多的亏,所以希望有人不跟我一样吃亏.因为我本身不够仔细的原因,所以我希望能够做一些总结.---废话讲完. 这个文章已经过时了.是几年前写的.http://www. ...

  9. 记录平时code点滴,这次是通过一张充满异样字符的表,对数据表中的每一列进行清理,比double quotation的issue难多了!

    需要提供对象: 一张需要被替换字符的表. 通过游标结合动态SQL对某一张特定表的所有列进行更新,主要是对其列值的异常字符处理. dbo.Characters_need_to_be_replaced c ...

  10. Android - This Handler class should be static or leaks might occur.

    今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class shoul ...