学习“迷你ASP.NET MVC框架”后的小结
看蒋老师MVC的书第二个大收获可以是算是看了这个迷你ASP.NET MVC框架了,虽然它远不如真正ASP.NET MVC(下文简称“MVC”)那么复杂庞大,但在迷你版中绕来绕去也够呛的。这部分我看了几回,也没完完全全地弄清里面的结构,但要透彻了解整个MVC框架,贯通了整个迷你MVC框架必不可少,没了迷你的作为基础,在看完整框架时也不知道走到哪一步了。贯通整个框架虽然复杂,但我觉得可以从分层次的角度去看整个框架,化整为零,那么难度就降下来了。
首先对于平常的Http请求来了,服务器对作相应的处理,处理完毕之后就会给浏览器一个Http响应。最简单的就是浏览器发出来一个对index.htm页面的请求,服务器就会读取index.htm文件的内容然后把内容包含在报文里面传递给浏览器昨晚响应。这个就是单纯的URL与物理文件绑定,在ASP.NET里面多加了路由机制,它就使得URL与物理文件分离。MVC里面其中一个重要部分就是路由机制,整个请求响应过程就变成了

也就是接收到一个请求之后用IhttpModule接口把请求拦截下来,按照路由规则分析了URL并匹配好对应的路由之后,用一个实现IHttpHandler接口的类的实例去做相应的处理,处理完毕就返回HttpResponse到浏览器。这个就是MVC框架的最顶层部分了。在这里我们还没看到平时在使用MVC是接触到的Route,Controller和Action。如果跟两个接口扯上关系的话,那就是Route主要是在HttpModule部分被使用,Controller和Action是在HttpHandler部分被使用。大框架已经定好的话,现在可以细化了,可以分别从HttpModule和HttpHandler去看整个流程。
IHttpModule
由UrlRouteModule去实现这个接口,处理过程大致是根据当前的请求上下文,构造HttpContextWapper对象。通过全局路由表来匹配当前请求的URL,获取到路由之后就通过路由和HttpContextWapper构造出请求上下文(RequestContext),从路由中获取一个实现IRouteHandler接口的类的实例,那是个MvcRouteHandler的实例,从那个实例中调用GetHttpHandler方法获取到一个实现IHttpHandler接口的类的实例,最后从通过HttpContextWapper把IHttpHandler更替过去,IHttpModule的部分就完结了,接下来到HttpHandler部分的处理了。整个处理的流程也如下图所示

IHttpHandler
由MvcHandler来实现这个接口,在HttpModule部分已经把路由对象处理好了,MVC中剩下的调用控制器中的行为方法,传入参数,绑定相关模型,处理完毕之后返回一个ActionResult,最终通过视图的内容作为响应报文呈现在浏览器上。MvcHandler的处理就在ProcessRequset方法里执行。详细的流程如下,首先从传入的HttpRequestContext中获取控制器的名字,Controller控制器是通过控制器工厂获取的,控制器工厂是从ControllerBuilder中得到。Controller执行Execute方法,传入RequestContext参数。就会执行相应的行为方法。流程如下图

但是其实还有更多操作包含在Execute方法里面,因为还需要执行行为方法,从Route中获取参数传到行为方法里面,返回ActionResult等。
在ControllBase调用Execute方法里,通过传入的请求上下文(RequestContext)和控制器自身构造出一个控制器上下文(ControllerContext),最后调用一个实现IActionInvoker的接口执行行为方法,如下图所示

这里又有一个InvokeAction方法,里面核心部分就是通过反射调用Controller的行为方法,至于行为方法需要传入的参数,生成ParameterInfo实例是通过了调用IModelBinder接口的方法,通过上下文获取路由的参数,也是利用了反射机制设值。方法调用完毕后返回的是一个ActionResult抽象类的实例,那么最后执行了ActionResult的ExecuteResult方法,把响应的页面的内容生成出来。如下图所示

HttpHandler的操作就分成了这几块,如果凑在一起的话,图成这样了

对于HttpModule部分,有几个类的关系还是要理顺一下。

整幅图其实没有按照UML的格式去画的,那个我也已经忘了,我画图的目的在于罗列各个类,而且把类与类之间的调用标示出来,对于一个方法,从类图左侧引线出去的,那是返回,从右侧引线出去的那是传入。
整个框架用的接口还是挺多的,这个觉得就能给我一种达到解耦的目的。方法的调用不通过类来直接调用,而是通过接口的调用,这样就排除了主调类对被调类的访问,不需要知道其细节。
以上便是我对迷你MVC的学习笔记,可能有些园友觉得我多此一举,不管怎样多了解一点还是有好处的,以上有理解错的欢迎大家指出,谢谢!
熟悉其情况 查看其结构 理解其本质 思考其改进
学习“迷你ASP.NET MVC框架”后的小结的更多相关文章
- ASP.NET MVC框架开发系列课程 (webcast视频下载)
课程讲师: 赵劼 MSDN特邀讲师 赵劼(网名“老赵”.英文名“Jeffrey Zhao”,技术博客为http://jeffreyzhao.cnblogs.com),微软最有价值专家(ASP.NET ...
- 【工作笔记二】ASP.NET MVC框架下使用MVVM模式
ASP.NET MVC框架下使用MVVM模式 原文:http://www.cnblogs.com/n-pei/archive/2011/07/21/2113022.html 对于asp.net mvc ...
- 写自己的ASP.NET MVC框架(上)
http://www.cnblogs.com/fish-li/archive/2012/02/12/2348395.html 阅读目录 开始 ASP.NET程序的几种开发方式 介绍我的MVC框架 我的 ...
- BrnShop开源网上商城第二讲:ASP.NET MVC框架
在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下. 首先是数据的复用和传递:对于BrnShop的每一 ...
- 【转】ASP.NET MVC框架下使用MVVM模式-KnockOutJS+JQ模板例子
KnockOutJS学习系列----(一) 好几个月没去写博客了,最近也是因为项目紧张,不过这个不是借口,J. 很多时候可能是因为事情一多,然后没法静下来心来去写点东西,学点东西. 也很抱歉,突然看到 ...
- Spring.Net+Nhibernate+Asp.Net Mvc 框架
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (一)搭建你的环境 使用这套框架不是很长时间.但也基本应用了几个项目中了.在此和大家分享一下我是怎样一步一步搭建此框架 ...
- 写自己的ASP.NET MVC框架(下)
上篇博客[写自己的ASP.NET MVC框架(上)] 我给大家介绍我的MVC框架对于Ajax的支持与实现原理.今天的博客将介绍我的MVC框架对UI部分的支持. 注意:由于这篇博客是基于前篇博客的,因此 ...
- 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图
如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?
- asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析
下面我用一个实例来和大家分享一下我的经验,asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析. using Newtonsoft.Json; usin ...
随机推荐
- 深入探究js中无所不在的this
黄金守则: this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window而当函数被作为某个对象的方法调用时, this等于那个对象. 下面是一些相关实践: --------- ...
- 为什么需要在TypedArray后调用recycle
当我们没有在使用TypedArray后调用recycle,编译器会提示“This TypedArray should be recycled after use with #recycle()”. 官 ...
- 远程调试Java程序
java 可以以调试模式启动,启动后可以使用 jdb 对程序进行调试.以调试模式启动,需要加入以下参数: java -Xdebug -Xrunjdwp:transport=dt_socket,addr ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- Facebook 发布「流程」
时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...
- 常用CSS优化总结——网络性能与语法性能建议
在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时多少会用到一些,但突然问我,很难把自己知道的都说出来.页面优化明显不是一两句能够说完的,这两天总结了一下 ...
- 虚拟化平台cloudstack(6)——使用maven:jetty调试
调试环境 ubuntu 12.04 JDK1.7 apache-maven-3.10 eclipse 4.2 Juno mysql 5 apache ant JDK的配置和安装 安装可以参考: htt ...
- P,NP,NP_hard,NP_complete问题定义
背景:在看李航的<统计学习方法时>提到了NP完全问题,于是摆之. 问题解答:以下是让我豁然开朗的解答的摘抄: 最简单的解释:P:算起来很快的问题NP:算起来不一定快,但对于任何答案我们都可 ...
- document对象
document 对象是操作网页内容的 找元素 1.根据id找 document.getElementById(); 2.根据class找 document.getElementsByClassNam ...
- XML学习笔记7——XSD实例
在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改),也就是说,是 ...