/// <summary>
        /// 发布路由。
        /// </summary>
        /// <param name="routes">路由集合。</param>
        public void Publish(IEnumerable<RouteDescriptor> routes)
        {
            //排序。
            var routesArray = routes
                .OrderByDescending(r => r.Priority)
                .ToArray();

            //发布前事件。
            _routePublisherEventHandlers.Invoke(i => i.Publishing(routesArray), NullLogger.Instance);

            using (_routeCollection.GetWriteLock())
            {
                //释放现有路由。
                _routeCollection
                    .OfType<HubRoute>().Invoke(x => x.ReleaseShell(_shellSettings), NullLogger.Instance);
                var routeList = new List<RouteBase>(_routeCollection);

                //添加新路由
                foreach (var routeDescriptor in routesArray)
                {
                    //根据Route得到扩展描述符
                    ExtensionDescriptorEntry extensionDescriptor = null;
                    if (routeDescriptor.Route is Route)
                    {
                        object extensionId;
                        var route = routeDescriptor.Route as Route;
                        if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) ||
                            route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId))
                        {
                            extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString());
                        }
                    }
                    else if (routeDescriptor.Route is IRouteWithArea)
                    {
                        var route = routeDescriptor.Route as IRouteWithArea;
                        extensionDescriptor = _extensionManager.GetExtension(route.Area);
                    }

                    //加载会话状态信息。
                    var sessionState = SessionStateBehavior.Default;
                    if (extensionDescriptor != null)
                    {
                        if (routeDescriptor.SessionState == SessionStateBehavior.Default)
                        {
                            var descriptor = extensionDescriptor.Descriptor;
                            if (descriptor.Keys.Contains("SessionState"))
                                Enum.TryParse(descriptor["SessionState"], true, out sessionState);
                        }
                    }

                    //设置SessionState
                    var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default
                        ? sessionState
                        : routeDescriptor.SessionState;

                    //创建外壳路由
                    var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _webWorkContextAccessor,
                        _runningShellTable)
                    {
                        IsHttpRoute = routeDescriptor is HttpRouteDescriptor,
                        SessionState = sessionStateBehavior
                    };

                    //区域
                    var area = extensionDescriptor == null ? string.Empty : extensionDescriptor.Id;

                    //尝试查找已存在的集线器路由
                    var matchedHubRoute = routeList.FirstOrDefault(x =>
                    {
                        var hubRoute = x as HubRoute;
                        if (hubRoute == null)
                        {
                            return false;
                        }

                        return routeDescriptor.Priority == hubRoute.Priority &&
                               hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) &&
                               hubRoute.Name == routeDescriptor.Name;
                    }) as HubRoute;

                    //创建新的集线器路由。
                    if (matchedHubRoute == null)
                    {
                        matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority,
                            _runningShellTable);

                        int index;
                        for (index = 0; index < routeList.Count; index++)
                        {
                            var hubRoute = routeList[index] as HubRoute;
                            if (hubRoute == null)
                            {
                                continue;
                            }
                            if (hubRoute.Priority < matchedHubRoute.Priority)
                            {
                                break;
                            }
                        }
                        routeList.Insert(index, matchedHubRoute);
                    }

                    matchedHubRoute.Add(shellRoute, _shellSettings);
                }

                //清空现有路由。
                _routeCollection.Clear();
                foreach (var item in routeList)
                {
                    if (item is HubRoute)
                    {
                        _routeCollection.Add((item as HubRoute).Name, item);
                    }
                    else
                    {
                        _routeCollection.Add(item);
                    }
                }
            }

            //发布后事件。
            _routePublisherEventHandlers.Invoke(i => i.Published(routesArray), NullLogger.Instance);
        }
Exemple #2
0
        /// <summary>
        /// 发布路由。
        /// </summary>
        /// <param name="routes">路由集合。</param>
        public void Publish(IEnumerable <RouteDescriptor> routes)
        {
            //排序。
            var routesArray = routes
                              .OrderByDescending(r => r.Priority)
                              .ToArray();

            //发布前事件。
            _routePublisherEventHandlers.Invoke(i => i.Publishing(routesArray), NullLogger.Instance);

            using (_routeCollection.GetWriteLock())
            {
                //释放现有路由。
                _routeCollection
                .OfType <HubRoute>().Invoke(x => x.ReleaseShell(_shellSettings), NullLogger.Instance);
                var routeList = new List <RouteBase>(_routeCollection);

                //添加新路由
                foreach (var routeDescriptor in routesArray)
                {
                    //根据Route得到扩展描述符
                    ExtensionDescriptorEntry extensionDescriptor = null;
                    if (routeDescriptor.Route is Route)
                    {
                        object extensionId;
                        var    route = routeDescriptor.Route as Route;
                        if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) ||
                            route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId))
                        {
                            extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString());
                        }
                    }
                    else if (routeDescriptor.Route is IRouteWithArea)
                    {
                        var route = routeDescriptor.Route as IRouteWithArea;
                        extensionDescriptor = _extensionManager.GetExtension(route.Area);
                    }

                    //加载会话状态信息。
                    var sessionState = SessionStateBehavior.Default;
                    if (extensionDescriptor != null)
                    {
                        if (routeDescriptor.SessionState == SessionStateBehavior.Default)
                        {
                            var descriptor = extensionDescriptor.Descriptor;
                            if (descriptor.Keys.Contains("SessionState"))
                            {
                                Enum.TryParse(descriptor["SessionState"], true, out sessionState);
                            }
                        }
                    }

                    //设置SessionState
                    var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default
                        ? sessionState
                        : routeDescriptor.SessionState;

                    //创建外壳路由
                    var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _webWorkContextAccessor,
                                                    _runningShellTable)
                    {
                        IsHttpRoute  = routeDescriptor is HttpRouteDescriptor,
                        SessionState = sessionStateBehavior
                    };

                    //区域
                    var area = extensionDescriptor == null ? string.Empty : extensionDescriptor.Id;

                    //尝试查找已存在的集线器路由
                    var matchedHubRoute = routeList.FirstOrDefault(x =>
                    {
                        var hubRoute = x as HubRoute;
                        if (hubRoute == null)
                        {
                            return(false);
                        }

                        return(routeDescriptor.Priority == hubRoute.Priority &&
                               hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) &&
                               hubRoute.Name == routeDescriptor.Name);
                    }) as HubRoute;

                    //创建新的集线器路由。
                    if (matchedHubRoute == null)
                    {
                        matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority,
                                                       _runningShellTable);

                        int index;
                        for (index = 0; index < routeList.Count; index++)
                        {
                            var hubRoute = routeList[index] as HubRoute;
                            if (hubRoute == null)
                            {
                                continue;
                            }
                            if (hubRoute.Priority < matchedHubRoute.Priority)
                            {
                                break;
                            }
                        }
                        routeList.Insert(index, matchedHubRoute);
                    }

                    matchedHubRoute.Add(shellRoute, _shellSettings);
                }

                //清空现有路由。
                _routeCollection.Clear();
                foreach (var item in routeList)
                {
                    if (item is HubRoute)
                    {
                        _routeCollection.Add((item as HubRoute).Name, item);
                    }
                    else
                    {
                        _routeCollection.Add(item);
                    }
                }
            }

            //发布后事件。
            _routePublisherEventHandlers.Invoke(i => i.Published(routesArray), NullLogger.Instance);
        }