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. 3.3FactoryMethod——工厂方法

    意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 其实在抽象工厂模式中,经过改进后的模式就是工厂方法模式,所以不多说了,上UML图 ...

  2. ZBar只扫描二维码/条形码

    You can add these codes for ImageScanner scanner.setConfig(0, Config.ENABLE, 0); //Disable all the S ...

  3. [Node.js] Exporting Modules in Node

    In this lesson, you will learn the difference between the exports statement and module.exports. Two ...

  4. 四种可变交流swap方法

    1.void swap(int &x, int &y){ int temp=x; x=y; y=temp; } 2.void swap(int &x, int &y){ ...

  5. MYSQL 索引页 结构图

    create table t( a ) not ) default null,primary key(a)); mysql> select * from t; +----+------+ | a ...

  6. 两款Mac下的视频下载利器

    1 iSkysoft iTube Studio 2.jaksta mac

  7. Linux命令后台执行技巧小结

    1.最简单的方法: command & 例如: top & 此时显示job编号和后台进程号 [] 2.正在运行的程序放入后台 Ctrl - Z 3.查看有哪些后台进程及状态 jobs ...

  8. Http请求通信(工具类)

    Http请求通信(工具类) 异步消息处理流程是: 首先需要在主线程当中创建一个Handle对象,并重写handlerMessage()方法. 然后当子线程中需要进行UI操作时,就创建一个Message ...

  9. Android - IOExceptionConnection to xxx refused.

    还是stackoverflow上老外牛,往google上type一下,就找到原因了. 今天在使用Apache提供的HttpClient连接Tomcat服务器,使用log捕获异常的时候,提示说:IOEx ...

  10. windows 8 vpn 错误解决

    最近微软发布了Windows 8 RTM版,很多朋友也安装了,我当然也不例外.这几天就有不少朋友问我VPN连接无论怎么都说密码错误不能验证,于是,便连接VPN进行了下测试,如下: 配置好VPN,步凑不 ...