Orchard源码分析:Routing(路由)相关.docx_第1页
Orchard源码分析:Routing(路由)相关.docx_第2页
Orchard源码分析:Routing(路由)相关.docx_第3页
Orchard源码分析:Routing(路由)相关.docx_第4页
Orchard源码分析:Routing(路由)相关.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Orchard对mvc路由重新做了包装,重写了的路由模块一、路由模块类图1、路由 DescriptorRouteDescriptor是对常规mvc路由的包装类,它的Route属性就是在mvc注册路由中使用的RouteBase类型。在Orchard中注册路由,应该用这种方式1.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方法1.publicoverrideRouteDataGetRouteData(HttpContextBase httpContext) var settings = _runningShellTable.Match(httpContext); if(settings =null) returnnull; /这里获取1个ShellRoute的集合 IList 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方法1.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.DataTokensIWorkContextAccessor= _workContextAccessor; if(IsHttpRoute) routeData.ValuesIWorkContextAccessor= _workContextAccessor;/ for WebApi return routeData;3、路由注册 Orchard的路由注册功能由2个接口定义:IRouteProvider、IRoutePublisher。Orchard提供默认的实现:DefaultRouteProvider和RoutePublisher类3.1、DefaultRouteProvider类:1.publicclassDefaultRouteProvider:IRouteProvider /GetRoutes方法中定义了你要使用的所有的路由信息. publicIEnumerableGetRoutes() returnnew newRouteDescriptor Priority=-20, Route=newRoute( controller/action/id, newRouteValueDictionary controller,home, action,index, id, , newRouteValueDictionary controller,newHomeOrAccount() , newMvcRouteHandler() ; publicvoidGetRoutes(ICollection routes) foreach(var routeDescriptor inGetRoutes() routes.Add(routeDescriptor); 3.2、RoutePublisher类:1. public void Publish(IEnumerable routes) var routesArray = routes .OrderByDescending(r = r.Priority) .ToArray(); / this is not called often, but is intended to surface problems before / the actual collection is modified var preloading = new RouteCollection(); foreach (var routeDescriptor in routesArray) / extract the WebApi route implementation var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor; if (httpRouteDescriptor != null) var httpRouteCollection = new RouteCollection(); httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints); routeDescriptor.Route = httpRouteCollection.First(); preloading.Add(routeDescriptor.Name, routeDescriptor.Route); using (_routeCollection.GetWriteLock() / existing routes are removed while the collection is briefly inaccessable _routeCollection .OfType() .ForEach(x = x.ReleaseShell(_shellSettings); / new routes are added foreach (var routeDescriptor in routesArray) / Loading session state information. var defaultSessionState = SessionStateBehavior.Default; ExtensionDescriptor extensionDescriptor = null; if (routeDescriptor.Route is Route) object extensionId; var route = routeDescriptor.Route as Route; if (route.DataTokens != null & route.DataTokens.TryGetValue(area, out extensionId) | route.Defaults != null & route.Defaults.TryGetValue(area, out extensionId) extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString(); else if (routeDescriptor.Route is IRouteWithArea) var route = routeDescriptor.Route as IRouteWithArea; extensionDescriptor = _extensionManager.GetExtension(route.Area); if (extensionDescriptor != null) / if session state is not define explicitly, use the one define for the extension if (routeDescriptor.SessionState = SessionStateBehavior.Default) Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState); / Route-level setting overrides module-level setting (from manifest). var sessionStateBehavior = routeDescriptor.SessionState = SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState; var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable) IsHttpRoute = routeDescriptor is HttpRouteDescriptor, SessionState = sessionStateBehavior ; var area = extensionDescriptor = null ? : extensionDescriptor.Id; var matchedHubRoute = _routeCollection.FirstOrDefault(x = var hubRoute = x as HubRoute; if (hubRoute = null) return false; return routeDescriptor.Priority = hubRoute.Priority & hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) & hubRoute.Name = routeDescriptor.Name; ) as HubRoute; if (matchedHubRoute = null) matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority, _runningShellTable); int index; for (index = 0; index _routeCollection.Count; index+) var hubRoute = _routeCollectionindex as HubRoute; if (hubRoute = null) continue; if (hubRoute.Priority matchedHubRoute.Priority) break; _routeCollection.Insert(index, matchedHubRoute); matchedHubRoute.Add(shellRoute, _shellSettings); Publish方法将路由注册到 mvc 的路由系统中。二、如何在Module开发中使用路由系统 Orchard的功能都是通过Module实现的。那么在Module开发中如何使用 路由呢?我们以Orcahrd自己的 Orchard.BlogsModule为例,在Orchard中实现自己的路由其实很简单,只需要在自己的Module中创建1个实现IRouteProvider接口的类型即可。1. public class Routes : IRouteProvider private readonly IArchiveConstraint _archiveConstraint; private readonly IRsdConstraint _rsdConstraint; public Routes( IArchiveConstraint archiveConstraint, IRsdConstraint rsdConstraint) _archiveConstraint = archiveConstraint; _rsdConstraint = rsdConstraint; public void GetRoutes(ICollection routes) foreach (var routeDescriptor in GetRoutes() routes.Add(routeDescriptor); public IEnumerable GetRoutes() return new new RouteDescriptor Route = new Route( Admin/Blogs/Create, new RouteValueDictionary area, Orchard.Blogs, controller, BlogAdmin, action, Create , new RouteValueDictionary(), new RouteValueDictionary area, Orchard.Blogs , new MvcRouteHandler() , new RouteDescriptor Route = new Route( Admin/Blogs/blogId/Edit, new RouteValueDictionary area, Orchard.Blogs, controller, BlogAdmin, action, Edit , new RouteValueDictionary (), new RouteValueDictionary area, Orchard.Blogs , new MvcRouteHandler() , new RouteDescriptor Route = new Route( Admin/Blogs/blogId/Remove, new RouteValueDictionary area, Orchard.Blogs, controller, BlogAdmin, action, Remove , new RouteValueDictionary (), new RouteValueDictionary area, Orchard.Blogs , new MvcRouteHandler() , new RouteDescriptor Route = new Route( Admin/Blogs/blogId, new RouteValueDictionary area, Orchard.Blogs, controller, BlogAdmin, action, Item , new RouteValueDictionary (), new RouteValueDictionary area, Orchard.Blogs , new MvcRouteHandler() , new RouteDescriptor Route = new Route( Admin/Blogs/blogId/Posts/Create, new RouteValueDictionary area, Orchard.Blogs, controller, BlogPostAdmin, action, Create , new RouteValueDictionary (), new RouteValueDictionary area, Orchard.Blogs , new MvcRouteHandler() , new RouteDescriptor Route = new Route( Admin/Blogs/blogId/Posts/postId/Edit,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论