导航

09-011 Routing 之 RouteBuilder

Posted on 2015-04-09 12:39  DotNet1010  阅读(311)  评论(0)    收藏  举报

代码较少:请看下方:

 public class RouteBuilder : IRouteBuilder
    {
        public RouteBuilder()
        {
            Routes = new List<IRouter>();
        }

		// 这里是在MVC 部分定义的 MvcRouteHandler 
        public IRouter DefaultHandler { get; set; }

        public IServiceProvider ServiceProvider { get; set; }

		// 实现IRouter 接口的集合 如:TemplateRoute
        public IList<IRouter> Routes
        {
            get;
            private set;
        }

        public IRouter Build()
        {
            var routeCollection = new RouteCollection();

            foreach (var route in Routes)
            {
                routeCollection.Add(route);
            }

            return routeCollection;
        }
    }

 这个类常用的是其定义的扩展方法:

   public static IRouteBuilder MapRoute(this IRouteBuilder routeCollectionBuilder,
                                             string name,
                                             string template,
                                             object defaults,
                                             object constraints,
                                             object dataTokens)
        {
			//调用此方法前必须指定 DefaultHandler (MvcRouteHandler)
			if (routeCollectionBuilder.DefaultHandler == null)
			{
				throw new InvalidOperationException(Resources.DefaultHandler_MustBeSet);
			}

			// 调用此方法前必须添加: DefaultInlineConstraintResolver
			var inlineConstraintResolver = routeCollectionBuilder
                                                        .ServiceProvider
                                                        .GetRequiredService<IInlineConstraintResolver>();

            routeCollectionBuilder.Routes.Add(new TemplateRoute(routeCollectionBuilder.DefaultHandler,
                                                                name,
                                                                template,
                                                                ObjectToDictionary(defaults),
                                                                ObjectToDictionary(constraints),
                                                                ObjectToDictionary(dataTokens),
                                                                inlineConstraintResolver));

            return routeCollectionBuilder;
        }