HTML5技术

MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则) - 懒得安分(3)

字号+ 作者:H5之家 来源:H5之家 2016-11-03 18:00 我要评论( )

和版本二里面的区别不大,很多属性名和方法名都采用和版本二相同的规则,最大的区别就是在版本三里面,不再有RequestContext对象。UrlRoutingModule和MvcHandler两者打交道的桥梁在版本二里面是RequestContext对象

 和版本二里面的区别不大,很多属性名和方法名都采用和版本二相同的规则,最大的区别就是在版本三里面,不再有RequestContext对象。UrlRoutingModule和MvcHandler两者打交道的桥梁在版本二里面是RequestContext对象,在版本三里面变成了直接将当前的路由对象和上下文传到MvcHandler里面。

三、MvcHandler的实现

在MvcHandler里面变化比较大的只有两个:MvcHandler.cs和Controller.cs

1、MvcHandler.cs

namespace Swift.MVC { public class MvcHandler : IHttpHandler { public MvcHandler() { } public HttpContextBase SwiftContext { get; set; } public SwiftRouteData SwiftRouteData { get; set; } MvcHandler(SwiftRouteData routeData, HttpContextBase context) { SwiftRouteData = routeData; SwiftContext = context; } IsReusable { get { return false; } } ProcessRequest(HttpContext context) { //写入MVC的版本到HttpHeader里面 //AddVersionHeader(httpContext); //移除参数 //RemoveOptionalRoutingParameters(); controllerName = SwiftRouteData.RouteValue[].ToString(); //2.得到控制器工厂 IControllerFactory factory = new SwiftControllerFactory(); //3.通过默认控制器工厂得到当前请求的控制器对象 IController controller = factory.CreateController(SwiftRouteData, controllerName); if (controller == null) { return; } try { //4.执行控制器的Action controller.Execute(SwiftRouteData); } catch {} finally { //5.释放当前的控制器对象 factory.ReleaseController(controller); } } } }

相比版本二,这个类多了一个有两个参数的构造函数,用来将routeData和context传进来。然后再ProcessRequest方法里面直接通过传进来的对象去取当前请求的相关信息。

2、Controller.cs

namespace Swift.MVC { Controller:ControllerBase,IDisposable { Execute(SwiftRouteData routeData) { //1.得到当前控制器的类型 Type type = this.GetType(); actionName = routeData.RouteValue[].ToString(); parameter = null; )) { parameter = routeData.RouteValue[]; } var paramTypes = new List<Type>(); List<object> parameters = new List<object>(); if (parameter != null) { var dicParam = (Dictionary<string, string>)parameter; foreach (var pair in dicParam) { parameters.Add(pair.Value); paramTypes.Add(pair.Value.GetType()); } } //4.通过action名称和对应的参数反射对应方法。 //这里第二个参数可以不理会action字符串的大小写,第四个参数决定了当前请求的action的重载参数类型 System.Reflection.MethodInfo mi = type.GetMethod(actionName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase, null, paramTypes.ToArray(), null); //5.执行该Action方法 mi.Invoke(this, parameters.ToArray());//调用方法 } public void Dispose() { //throw new NotImplementedException(); } } }

在Execute()方法里面,对基础类型的Action方法参数重载提供了支持。

四、测试以及代码释疑

上文介绍了这么多,可能并不直观,很多类之间如何联系的看得并不清晰,反正如果是博主,别人这么介绍一个类又一个类,看完肯定还是蒙的的。那么我们来测试看下吧。

 首先,还是配置全局配置文件Global.asax

  public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { var defaultPath = new Dictionary<string, object>(); defaultPath.Add(, ); defaultPath.Add(, ); defaultPath.Add(, null); defaultPath.Add(, ); defaultPath.Add(, ); SwiftRouteTable.Routes.Add(, , defaultPath, new MvcRouteHandler())); } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码) - 懒得安分

    MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码) - 懒得安

    2016-10-31 15:00

  • javascript运动系列第九篇——碰撞运动 - 小火柴的蓝色理想

    javascript运动系列第九篇——碰撞运动 - 小火柴的蓝色理想

    2016-10-29 18:00

  • 深究angularJS系列 - 第二弹 - 雨夜羽翼

    深究angularJS系列 - 第二弹 - 雨夜羽翼

    2016-10-29 10:00

  • HTML5学习 - 小熊吉米

    HTML5学习 - 小熊吉米

    2016-10-28 18:01

网友点评
r