首先是第一个重要点(1),匹配RouteData对象;其实就是我们在程序里面配置的Url模板数据,当请求来的时候我们需要去根据当前请求的Url到路由表去匹配是否有符合当前Url的路由对象;
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
其实就是对应着本段代码的配置,这段代码处理后将是一个Route对象实例,而上面的RouteCollection就很好理解了,它是Route的强类型集合;
到目前为止,已经出现了好几个跟Route相关的对象,没关系,当我们将整条线分析到头时将很清楚他们的作用;
第二个重要点(2),封装RequestContext对象,其实我们从类型的名称上就能确定它的用途,它是请求上下文,也是有界上下文;这里面封装了在下面获取IHttpHander接口时将需要当作参数;
第三个重点(3),利用前面的匹配得到的RouteData对象,其实RouteData是路由数据的意思,那么什么叫路由数据:就是路由匹配成功后所生成的和路由相关的数据;还记得我们在3】节分析的原理吗,UrlRoutingModule对上层提供基本的路由功能,但是具体的处理是在应用层面上;
那么就是这里通过RouteData.RouteHandler.GetHttpHandler(RequestContext requestContext) 方法获取到的最终顶层应用处理器;
图4.1:
上面的解释可以使用这幅图来简单的表达;
UrlRoutingModule对象通过RouteData路由数据对象获取IRouteHander接口,然后通过IRouteHander接口获取最终的IHttpHander接口;
小结:其实可以将UrlRoutingModule对象理解成是ASP.NETRouting模块的基础部分,而扩展的地方则在我们应用程序配置的地方,也就是我们通常在Global.asax.cs文件中配置的路由数据;当我们在配置Route对象的时候其实已经指定了IRouteHander接口,然后这个接口会被放入RouteData同名属性中,而不是作为零散的对象被UrlRoutingModule直接获取;
4.2】RouteBase、Route、RouteCollection、RouteTable路由核心对象模型
在4.1 】节中,UrlRoutingModule是路由框架的基础设施部分,内置于. NETFramework系统及ASP.NET配置之中web.config;在ASP.NET进行版本升级的时候该部分工作已经由系统自动帮我们升级,我们在使用的时候只需要创建ASP.NET3.5 SP1以上的版本都会自动拥有路由系统功能,因为根据微软官方MSDN介绍,路由系统是在ASP.NET3.5 SP1中引入的;其实我们大部分使用的ASP.NET版本已经是4.5的,就算以前是2.0、3.0的版本也会陆续升级到最新的版本;因为新版本的框架提供了无数个让你无法拒绝的优势;
那么当基础部分有了之后我们能做到就是应用编程接口的编程,其实这部分才是我们接触的地方;而这一小节我们将重点分析路由系统提供给我们应用层面的编程接口,也就是上面标题列出的几个核心对象;
先基本介绍一下这几个对象的意思和彼此之间的关系:
RouteBase:很明显是Route的基类,提供了作为自定义路由对象的顶层抽象,所有的路由框架的内部均使用抽象的RouteBase为依赖;
Route:路由系统默认实现的路由对象继承自RouteBase抽象基类,用来作为我们默认的路由配置对象,当然你可以可是实现自己的Route对象;
RouteCollection:Route作为单个Url的配置,那么系统中肯定会有多个Url规则的配置,所以RouteCollection对象是表示Route的强类型集合,该类继承自 Collection<RouteBase> 类型;所以RouteCollection是用来作为Route的集合管理用的;注意这里的泛型Collection<T>中的RouteBase,再一次提醒我们要“依赖倒置”;
RouteTable:用来存放RouteCollection对象,路由表中有一系列的路由对象,而这一系列的对象就是RouteCollection管理的;在RouteTable中用Routes静态属性表示当前系统全局的路由映射表;
这里很明显能看出来对路由的一层一层抽象,从简单的Route表示一个路由映射,再到表示Route的集合RouteCollection,再到最后的RouteTable的,抽象的很OO;
为了让大家对上面这些对象的解释有一个直观的认识,我们用一张图来解释他们如何关联和执行流程;
图4.2:
下面我们将深入到各个对象的内部去摸索一下他们之间的交互,我们根据这种引用关系来分析,首先是Route对象;
【Route、RouteBase】