Пример #1
0
        private IList <RouteDescription> CreateRouteDescriptions(Type serviceType, ServiceAttribute serviceAttr)
        {
            var list = new List <RouteDescription>();

            //返回类型中所有公共、非公共以及继承链类型中的公共、受保护的实例方法
            var methods = serviceType.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

            foreach (var method in methods)
            {
                var actionAttr = method.GetCustomAttribute <ActionAttribute>();
                if (actionAttr != null)
                {
                    var routeDescription = new RouteDescription()
                    {
                        ServiceId   = serviceAttr.ServiceId,
                        ServiceName = serviceAttr.Name,
                        ServiceType = serviceType,
                        ActionId    = actionAttr.ActionId,
                        ActionName  = actionAttr.Name,
                        ActionType  = method,
                        Enabled     = serviceAttr.Enabled && actionAttr.Enabled
                    };
                    list.Add(routeDescription);
                    logger.LogDebug($"Create RouteDesctiption. ServiceId={routeDescription.ServiceId}, ActionId={routeDescription.ActionId}, ServiceType={routeDescription.ServiceType}, ActionType={routeDescription.ActionType}");

                    if (serviceConfigs != null && serviceConfigs.Count > 0)
                    {
                        var serviceConfig = serviceConfigs.Where(c => c.ServiceId == serviceAttr.ServiceId).FirstOrDefault();
                        if (serviceConfig != null)
                        {
                            routeDescription.ServiceName = string.IsNullOrEmpty(serviceConfig.Name) ? routeDescription.ServiceName : serviceConfig.Name;
                            routeDescription.Enabled     = serviceConfig.Enabled;
                            var config = serviceConfig.Actions?.Where(c => c.ActionId == actionAttr.ActionId).FirstOrDefault();
                            if (config != null)
                            {
                                routeDescription.ActionName = string.IsNullOrEmpty(config.Name) ? routeDescription.ActionName : config.Name;
                                routeDescription.Enabled    = serviceConfig.Enabled && config.Enabled;
                            }
                            logger.LogDebug($"One service is changed by service config. ServiceId={routeDescription.ServiceId}, ActionId={routeDescription.ActionId}");
                        }
                    }
                }
            }

            return(list);
        }
Пример #2
0
        /// <summary>
        /// 添加路由
        /// </summary>
        /// <param name="route"></param>
        public void AddRoute(RouteDescription route)
        {
            if (!routeList.ContainsKey(route.ServiceId))
            {
                routeList.Add(route.ServiceId, new Dictionary <int, RouteDescription>());
            }

            var serviceRouteList = routeList[route.ServiceId];

            if (serviceRouteList.ContainsKey(route.ActionId))
            {
                throw new RouteRepeatException(route.ServiceId, route.ActionId);
            }

            serviceRouteList.Add(route.ActionId, route);
            routeCache.Add(route);
            logger.LogDebug($"Add route success. ServiceId={route.ServiceId}, ActionId={route.ActionId}");
        }