仅此一文让你明白www.mareenoire.info MVC原理
www.mareenoire.info MVC由以下两个核心组成部分构成:
- 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;
- 一个名为MvcHandler的自定义HttpHandler,用来实现对Controller的激活和Action的执行;
!!阅读本文前请先弄明白www.mareenoire.info执行的流程及httpmodule与httphandler的作用。
下面是进行路由转换时相关类的简化结构图:
整个www.mareenoire.info MVC系统的路由信息全部存放在RoteTable这个类的静态变量Routes(为一个RouteDictionary类型)中,网站开始运行时,在Application_Start中对路由进行注册:
RouteTable.Routes.Add("default",
new Route{Url="{controller}/{action}"});
new Route{Url="{controller}/{action}"});
当一个URL请求到来时,被UrlRoutingModule拦截,拦截后执行流程如下:
- 封装当前http上下文,变为HttpContextWrapper对象。
- 根据当前的http上下文,从Routes中得到与当前请求URL相符合的RouteData对象。该对象存储有RouteHandler信息。
- 把RouteData与http上下文请求封装成一个RequestContext对象。
- 根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler。
- 执行IHttpHandler,进行请求的真正处理。
执行时序图如下图所示:
UrlRoutingModule的代码如下:
HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);
RequestContext requestContext = new RequestContext{ data = routeData, context= httpContext};
IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
httpContext.RemapHandler(handler);
RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);
RequestContext requestContext = new RequestContext{ data = routeData, context= httpContext};
IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
httpContext.RemapHandler(handler);
经过上面最后一步,执行HttpHandle后,程序正式进入Controller激活里面,相关类关系如下图所示:
同URL路由一样,MVC初始化时,也需要注册控制器的一些信息,这里是要让框架知道默认的控制器工厂是什么,所以在Application_Start中:
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
程序通过上面的URL路由转换后,进入HttpHandle中,经过以下步骤实现对Controller的激活:
- 从Requestcontext封装的RouteData中得到Controller名字。
- 通过ControllerBuilder得到当前默认的Controller工厂。
- 根据Controller的名字,创建控制器对象(在ControllerFactory初始化的时候,会扫描整个程序集中所有实现IController接口的控制器类型,所以当调用CreateController时,实际上是直接获取)。
- 最后执行控制器。执行的实质其实就是执行ActionInvoker.InvokeAction,即根据请求上下文执行相应的Action。
在自定义的MvcHandler中,代码如下:
string controllerName =this.Requestcontext.RouteData.Controller;
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
//通过controllerName得到Control(如HomeController)
IController controller = controllerFactory.CreateController(this.RequestContext,controllerName);
controller.Execute(this.RequestContext);
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
//通过controllerName得到Control(如HomeController)
IController controller = controllerFactory.CreateController(this.RequestContext,controllerName);
controller.Execute(this.RequestContext);
一个典型的IActionInvoker接口实现ControllerActionInvoker的InvokeAction方法如下:
public void InvokeAction(ControllerContext controllerContext,
string actionName)
{
//找到Action方法
MethodInfo method = controllerContext.Controller.GetType().GetMethods()
.First(m=>string.Compare(actionName,www.mareenoire.info,true)==); //获取Action参数,并进行Model绑定
List
string actionName)
{
//找到Action方法
MethodInfo method = controllerContext.Controller.GetType().GetMethods()
.First(m=>string.Compare(actionName,www.mareenoire.info,true)==); //获取Action参数,并进行Model绑定
List
相关推荐
- 玩侠盗猎车手5时出现提示xinp
- 玩游戏时出现0xc0000142
- 如何使用MySQL创建可靠的测试
- 性能优化:SQL Server性
- 存储设备支持MSSQL数据库安全
- c语言打印杨辉三角
- [问题03] 如何决定使用Has
- [问题03] 如何决定使用Has
- 编译器设计简介
- Linux 的分支:探索新的可能
- 如何快速掌握Linux知识(《l
- js将当前时间格式化为年月日时:
- 推荐Vue插件vetur
- 万字总结Keras深度学习中文文
- Kaggle 数据挖掘比赛经验分
- 卸载vs2012的工具栏_vs2
- Visual Studio 20
- vs2010动态库库_动态链接库
- stm32程序存放在哪里(stm
- 富顺5032插件机使用视频(富顺
- freetype vs2010_
- 七种常见的企业攻击类型
- 服务器被ARP攻击,网站被黑
- 如何从 Ubuntu 修复 Wi
- 微软总裁布拉德·史密斯谈收购动视
- Microsoft Edge浏览
- 微软调整Win11在欧洲经济区策
- 为什么大多数人选择Java编程语
- win7系统怎么更改打印机缓存文
- win7真正永久激活方法|怎么让
Copyright© 黑海资讯