HTML5技术

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

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

前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习。虽然微软的Routing功能已经非常强大,完全没有必要再重复造轮子了,但博主还是觉得自己动手写一遍印象要深刻许多,希望想深入学习MVC的童

前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习。虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉得自己动手写一遍印象要深刻许多,希望想深入学习MVC的童鞋自己动手写写。好了,废话就此打住。

 本文原创地址:

MVC源码学习系列文章目录:

一、版本三功能介绍

在版本三里面,为了更加透彻理解UrlRoutingModule里面的路由功能,博主自己写了一遍路由的读取和配置过程,完成之后整个框架的代码目录结构如下:

主要还是分为两大块:MVC目录里面的对应着MvcHandler的逻辑,Routing目录对象对应的UrlRoutingModule的逻辑。整个调用过程如下:

看到这个图,你可能仍然是懵比状态。没关系,如果你有兴趣,且往下看。

二、UrlRoutingModule的实现

在整个UrlRoutingModule里面,我们所有的路由相关逻辑都和System.Web.Routing这个组件没有任何联系,完全是一块独立的区域。为了方便理解,这些文件的命名在原来System.Web.Routing组件里面的类前面都加上一个“Swift”。UrlRoutingModule的主要逻辑都在以下这些文件里面:

1、SwiftRouteTable.cs代码

namespace Swift.MVC.Routing { public class SwiftRouteTable { SwiftRouteTable() { routes = new SwiftRouteCollection(); } private static SwiftRouteCollection routes; public static SwiftRouteCollection Routes { get { return routes; } } } }

这个类主要作用就是定义一个静态全局的SwiftRoutingCollection对象,在Global.asax里面可以配置这个路由集合。为什么是一个静态全局变量呢?静态是为了保证对象不被释放(GC回收);全局是为了保证整个应用程序都可以访问得到。

2、SwiftRouteCollection.cs代码

上文在SwiftRouteTable里面定义一个静态全局的SwiftRoutingCollection变量,我们来看这个里面到底有些什么东西。

namespace Swift.MVC.Routing { public class SwiftRouteCollection { public SwiftRoute SwiftRoute { get; set; } public string Name { get; set; } Add(string name, SwiftRoute route) { SwiftRoute = route; Name = name; } SwiftRouteData GetRouteData(HttpContextBase context) { var swiftRouteData = new SwiftRouteData(); //1.配置RouteHandler实例,这里的RouteHandler是在全局配置里面写进来的 swiftRouteData.RouteHandler = SwiftRoute.RouteHandler; virtualPath = context.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + context.Request.PathInfo; //3.先将默认路由配置写入当前请求的路由表 //每次请求只能读取默认值,而不能覆盖默认值 swiftRouteData.RouteValue = new Dictionary<string, object>() ; foreach (var key in this.SwiftRoute.DefaultPath) { swiftRouteData.RouteValue[key.Key] = key.Value; } (!string.IsNullOrEmpty(virtualPath)) { .ToCharArray(), StringSplitOptions.RemoveEmptyEntries); .ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < arrTemplatePath.Length; i++) { var realPath = arrRealPath.Length > i ? arrRealPath[i] : null; if (realPath == null) { break; } swiftRouteData.RouteValue[arrTemplatePath[i]] = realPath; } } querystring = context.Request.QueryString.ToString(); if (string.IsNullOrEmpty(querystring)) { return swiftRouteData; } .ToArray(), StringSplitOptions.RemoveEmptyEntries) ; var oparam = new Dictionary<string, string>(); foreach (var parameter in parameters) { .ToArray()); oparam[keyvalue[0]] = keyvalue[1]; } swiftRouteData.RouteValue[] = oparam; return swiftRouteData; } } }

这个类的结构也不复杂,两个属性,两个方法。方法Add()用来给两个属性赋值,方法GetRouteData()主要作用注释中已经注明。要详细了解GetRouteData()方法的逻辑,我们有必要先看看SwiftRoute这个类型。

3、SwiftRoute.cs代码

 

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

网友点评
p