public static MessageTypeAttribute GetMessageTypeAttribute(Type messageType)
        {
            if (_messageTypeAttributeDic.TryGetValue(messageType, out MessageTypeAttribute attr))
            {
                return(attr);
            }
            lock (_locker) {
                if (_messageTypeAttributeDic.TryGetValue(messageType, out attr))
                {
                    return(attr);
                }
                object atrrObj = messageType.GetCustomAttributes(typeof(MessageTypeAttribute), false).FirstOrDefault();
                if (atrrObj == null)
                {
                    attr = new MessageTypeAttribute(messageType.Name);
                    Logger.ErrorDebugLine($"意外,消息类型 {messageType.FullName} 未打上 {nameof(MessageTypeAttribute)} 特性");
                }
                else
                {
                    attr = (MessageTypeAttribute)atrrObj;
                }
                _messageTypeAttributeDic.Add(messageType, attr);

                return(attr);
            }
        }
示例#2
0
        public static MessageTypeAttribute GetMessageTypeAttribute(Type messageType)
        {
            if (_messageTypeAttributeDic.TryGetValue(messageType, out MessageTypeAttribute attr))
            {
                return(attr);
            }
            lock (_locker) {
                if (_messageTypeAttributeDic.TryGetValue(messageType, out attr))
                {
                    return(attr);
                }
                object atrrObj = messageType.GetCustomAttributes(typeof(MessageTypeAttribute), false).FirstOrDefault();
                if (atrrObj == null)
                {
                    attr = new MessageTypeAttribute(messageType.Name);
                }
                else
                {
                    attr = (MessageTypeAttribute)atrrObj;
                }
                _messageTypeAttributeDic.Add(messageType, attr);

                return(attr);
            }
        }
示例#3
0
        public static MessageTypeAttribute GetMessageTypeAttribute(Type messageType)
        {
            if (_messageTypeAttributeDic.ContainsKey(messageType))
            {
                return(_messageTypeAttributeDic[messageType]);
            }
            object atrrObj = messageType.GetCustomAttributes(typeof(MessageTypeAttribute), false).FirstOrDefault();
            MessageTypeAttribute attr;

            if (atrrObj == null)
            {
                attr = new MessageTypeAttribute(messageType.Name);
            }
            else
            {
                attr = (MessageTypeAttribute)atrrObj;
            }
            _messageTypeAttributeDic.Add(messageType, attr);

            return(attr);
        }
示例#4
0
        public void Route <TMessage>(TMessage message) where TMessage : IMessage
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            MessagePath <TMessage>[] messagePaths = PathSetSet.GetMessagePathSet <TMessage>().GetMessagePaths();
            if (messagePaths.Length == 0)
            {
                Type messageType = typeof(TMessage);
                MessageTypeAttribute messageTypeAttr = MessageTypeAttribute.GetMessageTypeAttribute(messageType);
                if (!messageTypeAttr.IsCanNoHandler)
                {
                    Write.DevWarn(messageType.FullName + "类型的消息没有对应的处理器");
                }
            }
            else
            {
                foreach (var messagePath in messagePaths)
                {
                    bool canGo = false;
                    if (message is IEvent evt)
                    {
                        canGo =
                            evt.TargetPathId == PathId.Empty || // 事件不是特定路径的事件则放行
                            messagePath.PathId == PathId.Empty || // 路径不是特定事件的路径则放行
                            evt.TargetPathId == messagePath.PathId;    // 路径是特定事件的路径且路径和事件造型放行
                    }
                    else if (message is ICmd cmd)
                    {
                        // 路径不是特定命令的路径则放行
                        if (messagePath.PathId == PathId.Empty)
                        {
                            canGo = true;
                        }
                        else
                        {
                            canGo = messagePath.PathId == cmd.MessageId;
                        }
                    }
                    if (canGo && messagePath.ViaTimesLimit > 0)
                    {
                        // ViaTimesLimite小于0表示是不限定通过的次数的路径,不限定通过的次数的路径不需要消息每通过一次递减一次ViaTimesLimit计数
                        messagePath.DecreaseViaTimesLimit(onDownToZero: RemoveMessagePath);
                    }
                    if (!messagePath.IsEnabled)
                    {
                        continue;
                    }
                    if (canGo)
                    {
                        switch (messagePath.LogType)
                        {
                        case LogEnum.DevConsole:
                            if (DevMode.IsDevMode)
                            {
                                Write.DevDebug($"({typeof(TMessage).Name})->({messagePath.Location.Name}){messagePath.Description}");
                            }
                            break;

                        case LogEnum.Log:
                            Logger.InfoDebugLine($"({typeof(TMessage).Name})->({messagePath.Location.Name}){messagePath.Description}");
                            break;

                        case LogEnum.None:
                        default:
                            break;
                        }
                        messagePath.Go(message);
                    }
                }
            }
        }
示例#5
0
        public void Route <TMessage>(TMessage message) where TMessage : IMessage
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            MessagePath <TMessage>[] messagePaths = MessagePathSet <TMessage> .Instance.GetMessagePaths();

            if (messagePaths.Length == 0)
            {
                Type messageType = typeof(TMessage);
                MessageTypeAttribute messageTypeAttr = MessageTypeAttribute.GetMessageTypeAttribute(messageType);
                if (!messageTypeAttr.IsCanNoHandler)
                {
                    Write.DevWarn(messageType.FullName + "类型的消息没有对应的处理器");
                }
            }
            else
            {
                foreach (var messagePath in messagePaths)
                {
                    // isMatch表示该处路径是否可以通过该消息,因为有些路径的PathId属性不为Guid.Empty,非空PathId的路径只允许特定标识造型的消息通过
                    // PathId可以认为是路径的形状,唯一的PathId表明该路径具有唯一的形状从而只允许和路径的形状一样的消息结构体穿过
                    bool isMatch = messagePath.PathId == Guid.Empty;
                    if (!isMatch)
                    {
                        if (message is IEvent evt)
                        {
                            isMatch = messagePath.PathId == evt.BornPathId;
                        }
                        else if (message is ICmd cmd)
                        {
                            isMatch = messagePath.PathId == cmd.Id;
                        }
                    }
                    if (isMatch && messagePath.ViaLimit > 0)
                    {
                        // ViaLimite小于0表示是不限定通过的次数的路径,不限定通过的次数的路径不需要消息每通过一次递减一次ViaLimit计数
                        messagePath.DecreaseViaLimit(onDownToZero: RemoveMessagePath);
                    }
                    if (!messagePath.IsEnabled)
                    {
                        continue;
                    }
                    if (isMatch)
                    {
                        switch (messagePath.LogType)
                        {
                        case LogEnum.DevConsole:
                            if (DevMode.IsDevMode)
                            {
                                Write.DevDebug($"({typeof(TMessage).Name})->({messagePath.Location.Name}){messagePath.Description}");
                            }
                            break;

                        case LogEnum.Log:
                            Logger.InfoDebugLine($"({typeof(TMessage).Name})->({messagePath.Location.Name}){messagePath.Description}");
                            break;

                        case LogEnum.None:
                        default:
                            break;
                        }
                        messagePath.Go(message);
                    }
                }
            }
        }