Exemplo n.º 1
0
        public static MessagePath <TMessage> Build(IMessageDispatcher dispatcher, Type location, string description, LogEnum logType, Action <TMessage> path, Guid pathId, int viaLimit = -1)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }
            MessagePath <TMessage> handler = new MessagePath <TMessage>(location, description, logType, path, pathId, viaLimit);

            dispatcher.Connect(handler);
            return(handler);
        }
Exemplo n.º 2
0
        public static MessagePath <TMessage> Build(IMessageDispatcher dispatcher, Type location, string description, LogEnum logType, Action <TMessage> action)
        {
            if (action == null)
            {
                throw new ArgumentNullException(nameof(action));
            }
            MessagePath <TMessage> handler = new MessagePath <TMessage>(location, description, logType, action);

            dispatcher.Connect(handler);
            return(handler);
        }
Exemplo n.º 3
0
        public void Connect <TMessage>(MessagePath <TMessage> path)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }
            lock (_locker) {
                var keyType = typeof(TMessage);

                var pathId = path;
                if (!_paths.ContainsKey(pathId.Path))
                {
                    _paths.Add(pathId.Path, new List <IMessagePathId> {
                        pathId
                    });
                }
                else
                {
                    List <IMessagePathId> handlerIds = _paths[pathId.Path];
                    if (handlerIds.Count == 1)
                    {
                        Write.DevWarn($"重复的路径:{handlerIds[0].Path} {handlerIds[0].Description}");
                    }
                    handlerIds.Add(pathId);
                    Write.DevWarn($"重复的路径:{pathId.Path} {pathId.Description}");
                }
                if (_handlers.ContainsKey(keyType))
                {
                    var registeredHandlers = _handlers[keyType];
                    if (registeredHandlers.Count > 0 && typeof(ICmd).IsAssignableFrom(keyType))
                    {
                        // 因为一种命令只应被一个处理器处理,命令实际上可以设计为不走总线,
                        // 之所以设计为统一走总线只是为了将通过命令类型集中表达起文档作用。
                        throw new Exception($"一种命令只应被一个处理器处理:{typeof(TMessage).Name}");
                    }
                    if (!registeredHandlers.Contains(path))
                    {
                        registeredHandlers.Add(path);
                    }
                }
                else
                {
                    var registeredHandlers = new List <dynamic> {
                        path
                    };
                    _handlers.Add(keyType, registeredHandlers);
                }
                Connected?.Invoke(pathId);
            }
        }