MVC5框架解析之MvcHandler
从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的更多相关文章
- MVC5框架解析之Controller的创建
在上一讲中我们介绍了MvcHandler,知道在Handler里面注入两个接口属性分别为IControllerFactory和IController的factory和controller.并且通过IO ...
- Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利
Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海 ...
- ASP.NET MVC5框架揭秘 学习笔记01
1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...
- [转载]iOS 10 UserNotifications 框架解析
活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...
- ABP使用及框架解析系列 - [Unit of Work part.1-概念及使用]
前言 ABP ABP是“ASP.NET Boilerplate Project”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开 ...
- ABP使用及框架解析系列 - [Unit of Work part.2-框架实现]
前言 ABP ABP是“ASP.NET Boilerplate Project”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开 ...
- iOS 10 UserNotifications 框架解析
摘自:https://onevcat.com/2016/08/notification/ iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...
- Poco::TCPServer框架解析
Poco::TCPServer框架解析 POCO C++ Libraries提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程.文件.流,网络协议包括:HTTP.FTP.SMTP ...
- Scrapy爬虫框架解析
Scrapy框架解析 Scrapy框架大致包括以下几个组件:Scrapy Engine.Spiders.Scheduler.Item Pipeline.Downloader: 组件 Scrapy En ...
随机推荐
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...
- 蜗牛—JSP学习之JavaBean初识
初识: <%@ page language="java" import="java.util.*" pageEncoding="utf-8&qu ...
- 【硬件】DELLserver硬件监控及DELL系统管理工具OMSA介绍
1.1.1. DELLserver硬件监控及DELL系统管理工具OMSA介绍 本文介绍採用使用Nagios和OMSA监控DELLserver的硬件健康状态,Nagios监控的方式是NRPE模式,须要配 ...
- SQL Server与Oracle对比学习:表的管理和组织
http://blog.csdn.net/weiwenhp/article/details/8088979 我们知道数据库,顾名思义.最重要的东东就是管理数据,而数据在系统中主要是保存在表(table ...
- [Webpack 2] Intro to the Production Webpack Course
There are several lessons that will build on top of this project. It is a fairly standard, small web ...
- mybatis12 Usermapper.xml
输入和输出映射 通过parameterType完成输入映射,通过resultType和resultMap完成输出映射. 1.1parameterType传递pojo包装对象 可以定义pojo包装类型扩 ...
- 手动创建Servlet--J2EE学习笔记
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Serv ...
- Motion——shake攻略
1.子类化窗口 如果响应链中没有motionEnded:withEvent:消息的接收者,那么该消息就会被发送给应用程序的window对象.所以需要在window对象上拦截motionEnded:wi ...
- CentOS7安装Cobbler
安装EPEL源 # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 安装cobbler ...
- div随另一个div自动增高
<script type="text/javascript"> document.getElementById("div1").style.heig ...