/// <summary> /// 创建一个新的路由条目 /// </summary> /// <param name="uri">uri信息</param> /// <param name="action">路由行为</param> internal Route(Uri uri, RouteAction action) { this.uri = uri; this.action = action; options = new RouteOptions(); options.OnCompiledChange += ClearCompile; }
/// <summary> /// 合并默认值 /// </summary> /// <param name="options">外部路由配置</param> private void MergeDefaults(RouteOptions options) { if (defaults == null) { return; } foreach (var kv in defaults) { options.Defaults(kv.Key, kv.Value, false); } }
/// <summary> /// 合并where /// </summary> /// <param name="options">外部路由配置</param> private void MergeWhere(RouteOptions options) { if (wheres == null) { return; } foreach (var kv in wheres) { options.Where(kv.Key, kv.Value, false); } }
/// <summary> /// 合并错误时的调度 /// </summary> /// <param name="options"></param> protected void MergeOnError(RouteOptions options) { if (onError == null) { return; } IFilter <IRequest, Exception>[] filters = onError.FilterList; for (int i = 0; i < filters.Length; i++) { options.OnError(filters[i]); } }
/// <summary> /// 合并中间件 /// </summary> /// <param name="options"></param> protected void MergeMiddleware(RouteOptions options) { if (middleware == null) { return; } IFilter <IRequest, IResponse>[] filters = middleware.FilterList; for (int i = 0; i < filters.Length; i++) { options.Middleware(filters[i]); } }
/// <summary> /// 将当前路由配置中的信息合并到给定的路由配置中 /// </summary> /// <param name="options"></param> /// <returns></returns> public RouteOptions Merge(RouteOptions options) { //合并的过程是一个平级的过程,所以遵循以下原则: //当key不允许重复时,如果已经有值则不进行赋值 //当key是允许重复时,所有的合并操作追加在原始key list之后 MergeMiddleware(options); MergeOnError(options); MergeWhere(options); MergeDefaults(options); return(this); }
/// <summary> /// 合并错误时的调度 /// </summary> /// <param name="options">外部路由配置</param> private void MergeOnError(RouteOptions options) { if (onError == null) { return; } var filters = onError.FilterList; for (var i = 0; i < filters.Length; i++) { options.OnError(filters[i]); } }
/// <summary> /// 合并中间件 /// </summary> /// <param name="options">外部路由配置</param> private void MergeMiddleware(RouteOptions options) { if (middleware == null) { return; } var filters = middleware.FilterList; for (var i = 0; i < filters.Length; i++) { options.Middleware(filters[i]); } }
/// <summary> /// 路由组 /// </summary> public RouteGroup() { options = new RouteOptions(); routes = new List <IRoute>(); }
/// <summary> /// 创建一个新的路由条目 /// </summary> /// <param name="url"></param> /// <param name="action"></param> public Route(Uri uri, RouteAction action) { this.uri = uri; this.action = action; options = new RouteOptions(); }