看蒋老师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的学习笔记,可能有些园友觉得我多此一举,不管怎样多了解一点还是有好处的,以上有理解错的欢迎大家指出,谢谢!

  熟悉其情况 查看其结构 理解其本质 思考其改进

最新文章

  1. 【jQuery】初始化的三种方法
  2. DAY5 DVWA之SQL注入演练(low)
  3. 0930MySQL中实现高性能高并发计数器方案(例如文章点击数)
  4. ASP.NET MVC4/5 - Ajax 防止 CSRF攻击
  5. iOS设计模式之代理模式
  6. winform中如何在TextBox中只能输入数字(可以带小数点)
  7. 前端优化之动画为什么要尽量用css3代替js
  8. Java中的变量数据类型补充
  9. 【面试】我是如何面试别人List相关知识的,深度有点长文
  10. C# string contains 不区分大小写
  11. Codeforces 1083E The Fair Nut and Rectangles
  12. 阻塞式I/O实现简单TCP通信
  13. html5学习笔记2——新元素
  14. 一个简单的web.py论坛
  15. ChibiOS/RT 2.6.9 CAN Driver
  16. iOS:简易的音视屏播放框架XYQPlayer
  17. 配置MySQL 5.6的主从复制
  18. hdu 5009 离散化
  19. jQuery插件编写基础之“又见弹窗”
  20. 在ios中微信video和audio无法自动播放解决方案

热门文章

  1. [转]在cocos2d-x中让一个项目适配iphone、iphone retina、ipad、ipad retina四种分辨率
  2. Atom
  3. 青蛙的约会 java版
  4. 给UINavigationBar自定义颜色
  5. atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
  6. fir.im Weekly - 如何用 iPad 创造技术生产力
  7. C#设计模式-简单工厂
  8. 美团(iPad)顶部界面的简单实现, 及开发时常见bug
  9. hibernate(二)annotation第一个示例
  10. 深入理解javascript作用域系列第四篇——块作用域