Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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);
            }
        }
Example #3
0
 /// <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);
     }
 }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        /// <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());
        }
Example #6
0
 /// <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);
         }
     }
 }
Example #7
0
 /// <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);
 }