Orchard源码分析:Routing(路由)相关.docx
文本预览下载声明
Orchard对mvc路由重新做了包装,重写了的路由模块一、路由模块类图1、路由 DescriptorRouteDescriptor是对常规mvc路由的包装类,它的Route属性就是在mvc注册路由中使用的RouteBase类型。在Orchard中注册路由,应该用这种方式newRouteDescriptor{ Route=newRoute( Admin/Blogs/Create, newRouteValueDictionary{ {area,Orchard.Blogs}, {controller,BlogAdmin}, {action,Create} }, newRouteValueDictionary(), newRouteValueDictionary{ {area,Orchard.Blogs} }, newMvcRouteHandler())}???2、路由实现 Orchard的路由实现有2个类组成:HubRoute和ShellRoute类。它们都继承了System.Web.Routing.RouteBase类,要重新实现GetRouteData和GetVirtualPath方法2.1、HubRoute类中的GetRouteData方法publicoverrideRouteDataGetRouteData(HttpContextBase httpContext){ var settings = _runningShellTable.Match(httpContext); if(settings ==null) returnnull; //这里获取1个ShellRoute的集合 IListRouteBase routes; if(!_routesByShell.TryGetValue(settings.Name,out routes)) { returnnull; } foreach(var route in routes) { RouteData routeData = route.GetRouteData(httpContext);//这里的route是ShellRoute类型 if(routeData !=null) { return routeData; } } returnnull;}?HubRoute类只是1个route的分配器,它的GetRouteData方法只是从1个ShellRoute集合中获取匹配的?ShellRoute,而真正的获取RouteData?实例的是ShellRoute 类中的?GetRouteData方法?2.2、ShellRoute中的GetRouteData方法publicoverrideRouteDataGetRouteData(HttpContextBase httpContext){ // locate appropriate shell settings for request var settings = _runningShellTable.Match(httpContext); // only proceed if there was a match, and it was for this client if(settings ==null|| settings.Name!= _shellSettings.Name) returnnull; var effectiveHttpContext = httpContext; if(_urlPrefix !=null) effectiveHttpContext =newUrlPrefixAdjustedHttpContext(httpContext, _urlPrefix); var routeData = _route.GetRouteData(effectiveHttpContext);//这里获取的是真正的mvc RouteData if(routeData ==null) returnnull; // otherwise wrap handler and return it routeData.RouteHandler=newRouteHandler(_workContextAccessor, routeData.RouteHandler,SessionState); routeData.DataTokens[IWorkContextAccessor]= _workContextAccessor; if(IsHttpRoute) { routeData.Values[IWorkContextAccessor]= _workContextAccessor;// for WebApi } return routeData
显示全部