/// <summary> /// 编译控制器 /// </summary> /// <param name="type">控制器类型</param> /// <param name="baseRouted">控制器路由标记</param> private void ComplieController(Type type, RoutedAttribute baseRouted) { //类的属性标记中的基础路径 var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); var routeList = new List <IRoute>(); foreach (var method in methods) { IRoute[] routes; if ((routes = ComplieFunction(type, method, baseRouted)) != null) { routeList.AddRange(routes); } } var controllerWhere = ComplieDirection(baseRouted.Where); var controllerDefaults = ComplieDirection(baseRouted.Defaults); foreach (var route in routeList) { ComplieOptionsWhere(route, controllerWhere); ComplieOptionsDefaults(route, controllerDefaults); ComplieOptionsGroup(route, baseRouted); } }
/// <summary> /// 编译属性路由 /// </summary> /// <param name="type"></param> protected void ComplieRouted(Type type) { if (!type.IsDefined(this.routed, false)) { return; } object[] obj = type.GetCustomAttributes(this.routed, false); if (obj.Length <= 0) { return; } controllerFuncBuildRecord.Clear(); RoutedAttribute routed = null; for (int i = 0; i < obj.Length; i++) { routed = obj[i] as RoutedAttribute; if (routed == null) { continue; } if (string.IsNullOrEmpty(routed.Path)) { routed.Path = router.GetDefaultScheme() + "://" + ClassOrFunctionNameToRouteName(type.Name); } ComplieController(type, routed); } }
/// <summary> /// 增加组信息 /// </summary> /// <param name="route"></param> /// <param name="routed"></param> protected void ComplieOptionsGroup(IRoute route, RoutedAttribute routed) { if (!string.IsNullOrEmpty(routed.Group)) { route.Group(routed.Group); } }
/// <summary> /// 编译控制器 /// </summary> /// <param name="type"></param> /// <param name="routed"></param> protected void ComplieController(Type type, RoutedAttribute baseRouted) { //类的属性标记中的基础路径 MethodInfo[] methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); List <IRoute> routeList = new List <IRoute>(); IRoute[] routes; foreach (MethodInfo method in methods) { if ((routes = ComplieFunction(type, method, baseRouted)) != null) { routeList.AddRange(routes); } } Dictionary <string, string> controllerWhere = ComplieDirection(baseRouted.Where); Dictionary <string, string> controllerDefaults = ComplieDirection(baseRouted.Defaults); IRoute route; for (int i = 0; i < routeList.Count; i++) { route = routeList[i]; ComplieOptionsGroup(route, baseRouted); ComplieOptionsWhere(route, controllerWhere); ComplieOptionsDefaults(route, controllerDefaults); } }
/// <summary> /// 编译函数 /// </summary> /// <param name="controllerType">控制器类型</param> /// <param name="method">方法信息</param> /// <param name="baseRouted">控制器路由标记</param> private IRoute[] ComplieFunction(Type controllerType, MethodInfo method, RoutedAttribute baseRouted) { var routeds = method.GetCustomAttributes(this.routed, false); if (routeds.Length <= 0) { return(null); } var ret = new List <IRoute>(); RoutedAttribute routed; for (var i = 0; i < routeds.Length; i++) { routed = routeds[i] as RoutedAttribute; //如果没有给定方法路由名则默认提供 if (string.IsNullOrEmpty(routed.Path)) { routed.Path = ClassOrFunctionNameToRouteName(method.Name); } //如果是包含scheme完整的uri那么则忽略来自控制器提供的uri //这里的所有的开头都不允许出现‘/’ var path = routed.Path.TrimStart('/'); if (baseRouted != null && !HasScheme(routed.Path)) { //如果开发者提供了控制器的路由配置,那么将会合并控制器路由的全局部分 var index = baseRouted.Path.LastIndexOf("://"); if (index != -1 && (index + 3) == baseRouted.Path.Length) { path = baseRouted.Path + path; } else { path = baseRouted.Path.TrimEnd('/') + "/" + path; } } // 检查控制器内是否重复编译 if (controllerFuncBuildRecord.ContainsKey(path + "$" + method.Name)) { continue; } controllerFuncBuildRecord.Add(path + "$" + method.Name, true); // 检查全局是否重复编译 CheckRepeat(path, controllerType, method); var route = router.Reg(path, controllerType, method.Name); //编译标记中的属性路由中的配置到路由条目中 ComplieOptions(route, routed); ret.Add(route); } return(ret.ToArray()); }
/// <summary> /// 增加组信息 /// </summary> /// <param name="route">路由条目</param> /// <param name="routed">路由特性</param> private void ComplieOptionsGroup(IRoute route, RoutedAttribute routed) { if (!string.IsNullOrEmpty(routed.Group)) { var segment = routed.Group.Split(','); foreach (var group in segment) { route.Group(group); } } }
/// <summary> /// 编译配置信息 /// </summary> /// <param name="route">路由条目</param> /// <param name="routed">路由特性</param> private void ComplieOptions(IRoute route, RoutedAttribute routed) { ComplieOptionsWhere(route, ComplieDirection(routed.Where)); ComplieOptionsDefaults(route, ComplieDirection(routed.Defaults)); ComplieOptionsGroup(route, routed); }