从MvcHandler开始

首选MvcHandler显示实现了IHttpHandler接口中的void ProcessRequest(HttpContext context);

外层逻辑:

1.方法参数(context)类型的装换。(HttpContext类型->HttpContextBase类型)

HttpContext类是一个包含sealed修饰的类,不可再继承,如果MvcHandler里面处理请求的方式的参数为HttpContext类型,不考虑对Mvc其他功能模块的影响,从设计的角度来讲就已经违背了面向接口的编程方式。其实HttpContext类和HttpContextBase类里面的属性基本一样,我们去深入研究,大家可以去了解和反驳。

2.通过HttpContextBase类型的context去获取具体类型的Controller和ControllerFactory;

这里其实是一种IOC的思想,首先在MvcHandler的初始化方法(ProcessRequest)中定义两个分别接口类型为IController的控制器和IControllerFactory的控制器工厂。而真正能确定控制器和控制器真正类型是通过ProcessRequestInit(httpContext, out controller, out factory);反转到ControllerBuilder类中。

ControllerBuilder类负责IControllerFactory的创建。ControllerBuilder在创建的时候通过参数注入类接口类型为IResolver<IControllerFactory>的参数(serviceResolver)该接口唯一的成员就是Current;Current的注入是通过ControllerBuilder的静态属性Current获取到ControllerBuilder的实例,并且通过实例方法public void SetControllerFactory(IControllerFactory controllerFactory)或者 public void SetControllerFactory(Type controllerFactoryType)将自己继承与IControllerFactor接口的控制器工厂注入到ControllerBuilder中的静态属性Current中去。这就说明,我们必须在MvcHandler处理请求之前对Current属性进行注入(这不是废话..)。

3.好,上面两步大体的其实就是一些准备工作(通过Context以及注入的方式获取对应的工厂以及控制器)。我们要进入真正的处理环境了,看代码:

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
        {
            IController controller;
            IControllerFactory factory;
            ProcessRequestInit(httpContext, out controller, out factory);
            try
            {
                controller.Execute(RequestContext);
            }
            finally
            {
                factory.ReleaseController(controller);
            }
        }

很好理解,真正的执行在controller.Execute(RequestContext)方法中,以及执行完后通过控制器工厂释放当前控制器内存。注意:这种释放并非将整个控制器实例释放,控制器类中有定义一个结构体来避免有些不应该释放的资源。就说这么多,感觉这里多大家以后的编程,对Mvc的理解会更深层次一点。

内层逻辑:

真正关于controller.Execute(RequestContext);的执行结构会涉及到ControllerBase及Controller两个抽象类及三大Descriptor和Filters、Binds、Invoker、Cache、ActionResult等等,这方面的东西我会在以后全部解剖出来,讲解内容有什么问题,请各位不必吝啬提出来,非常感谢。

MVC5框架解析之MvcHandler的更多相关文章

  1. MVC5框架解析之Controller的创建

    在上一讲中我们介绍了MvcHandler,知道在Handler里面注入两个接口属性分别为IControllerFactory和IController的factory和controller.并且通过IO ...

  2. Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利

    Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海 ...

  3. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  4. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  5. ABP使用及框架解析系列 - [Unit of Work part.1-概念及使用]

    前言 ABP ABP是“ASP.NET Boilerplate Project”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开 ...

  6. ABP使用及框架解析系列 - [Unit of Work part.2-框架实现]

    前言 ABP ABP是“ASP.NET Boilerplate Project”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开 ...

  7. iOS 10 UserNotifications 框架解析

    摘自:https://onevcat.com/2016/08/notification/ iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  8. Poco::TCPServer框架解析

    Poco::TCPServer框架解析 POCO C++ Libraries提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程.文件.流,网络协议包括:HTTP.FTP.SMTP ...

  9. Scrapy爬虫框架解析

    Scrapy框架解析 Scrapy框架大致包括以下几个组件:Scrapy Engine.Spiders.Scheduler.Item Pipeline.Downloader: 组件 Scrapy En ...

随机推荐

  1. iOS性能优化中的离屏渲染

    GPU屏幕渲染有以下两种方式: On-Screen Rendering意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. Off-Screen Rendering意为离屏渲染 ...

  2. c pointer and array

    Pointer:  A pointer is a variable that contains the address of a variable. if c is a char and p is a ...

  3. 字符集详解 ------------------------ UNICODE +UTF8

    http://my.oschina.net/goldenshaw/blog?catalog=3294521 http://my.oschina.net/goldenshaw/blog?catalog= ...

  4. Sqlserver中实现oralce 数据库的rownumber

    引用自:http://cai555.javaeye.com/blog/466033 方法1: with temp as ( select row_number() over(order by city ...

  5. awk用法举例

    awk文本分割输出工具(按列输出工具) awk [options] ' PATTERN { action } ' file1, file2, ... 内置变量: FS:field separator, ...

  6. jsp获取服务端的访问信息

    获取服务端访问信息 public static String getUrl(HttpServletRequest request){ String url = ""; if(req ...

  7. VB------VS2012 IDE

    当编辑器的前面出现很多小点不影响 运行的时候 Ctrl+E+S就可以取消

  8. Spring中事务的5种属性总结

    Sping的事务 和 数据库的事务是不同的概念,数据库的事务一般称为底层事务 Spring的事务是对这种事务的抽象 我称之为逻辑事务 Spring对事务的功能进行了扩展,除了基本的Isolation之 ...

  9. For each db / table

    use master go exec master..sp_MSforeachdb 'use [?]; IF (SELECT db_id(''?'')) > 4 and (SELECT DATA ...

  10. 关于基于.net的WEB程序开发所需要的一些技术归纳

    前提: 最近公司里有一个同事,年龄比我大几岁,但是由于是转行来做开发的,许多的关于.net开发技术不是很入行,所以总是会问我一些东西,基于自己以前的一些 经验,总是会愿意给他讲一些总结性的东西,希望他 ...