从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. mongodb基本操作及存储图片显示方案

    先介绍下mongodb的基本操作及使用 第一部:开启安全性验证 如果需要给MongoDB数据库使用安全验证,则需要用--auth开启安全性检查,则只有数据库认证的用户才能执行读写操作,开户安全性检查, ...

  2. codeigniter nginx rewrite规则配置【转】

    转自:http://www.nginx.cn/1134.html nginx如何配置才能支持codeigniter ? 1. codeigniter的url美化去掉index.php   1 2 3 ...

  3. How to easily concatenate text based on criteria in Excel? 如何将Excel中的文本按条件合并

    To combine text with the unique ID numbers, you can extract the unique values first and then create ...

  4. 《Linux内核设计与实现》学习笔记之“Linux进程管理机制”

    一.进程(或者称为“任务”)简介 进程是OS最基本的抽象之一,通常进程包括“可执行程序代码”,“其他资源”(如:打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间,一个或多个执行线程等) 二. ...

  5. android 76 使用get post方式提交数据

    get方式: package com.itheima.getmethod; import java.io.InputStream; import java.net.HttpURLConnection; ...

  6. 深入理解iframe

    本文并不是一篇iframe API文档讲解,因此想了解iframe API的同学请移步 MDN, 我将在现在浏览器的角度与大家取探讨iframe, 因此,本文中虽然会提及一些iframe在旧浏览器中的 ...

  7. 如何正确合理的建立MYSQL数据库索引

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  8. 解析嵌套json字符串,一个json字符串中嵌套另一个json字符串

    我现在有一个字符串是这样: { "msg": { ", "attrName": "sensorData", "trans ...

  9. XPath操作XML文档

    NET框架下的Sytem.Xml.XPath命名空间提供了一系列的类,允许应用XPath数据模式查询和展示XML文档数据. 3.1XPath介绍 主要的目的是在xml1.0和1.1文档节点树种定位节点 ...

  10. webrtc学习———记录一

    最近导师让研究一下webrtc,希望将来用到我们的ICT2系统中. 但是从来没有过做web的基础,无论前端还是后端,html.js全都从头学起.html还好说,没有太过复杂的东西. js就有点难度了, ...