public void RemoveHandler(Type messageType, Type handlerType)
        {
            var baseHandlerTypes = MessageHandlerExtensions.GetBaseHandlerTypes(handlerType);

            foreach (var baseHandlerType in baseHandlerTypes)
            {
                var messageType1 = baseHandlerType.GenericTypeArguments.Single();
                if (messageType != messageType1)
                {
                    continue;
                }
                if (!_handlerDict.TryGetValue(messageType, out var handlers))
                {
                    continue;
                }
                if (handlers.All(handlerWrapper => handlerWrapper.BaseHandlerType != baseHandlerType))
                {
                    continue;
                }
                handlers = handlers.Where(x => x.BaseHandlerType != baseHandlerType).ToList();
                if (handlers.Count != 0)
                {
                    continue;
                }
                _handlerDict.Remove(messageType);
                var eventName = MessageNameAttribute.GetNameOrDefault(messageType);
                if (_messageTypeMappingDict.ContainsKey(eventName))
                {
                    _messageTypeMappingDict.Remove(eventName);
                }
                OnEventRemoved?.Invoke(this, messageType);
            }
        }
        private void RegisterMessageTypeMapping(Type messageType)
        {
            var eventName = MessageNameAttribute.GetNameOrDefault(messageType);

            if (!_messageTypeMappingDict.ContainsKey(eventName))
            {
                _messageTypeMappingDict.Add(eventName, messageType);
            }
        }
 public MessageHandlerWrapper(
     IServiceScopeFactory serviceScopeFactory,
     Type handlerType)
 {
     _serviceScopeFactory = serviceScopeFactory;
     MessageName          = MessageNameAttribute.GetNameOrDefault(typeof(TMessage));
     MessageType          = typeof(TMessage);
     HandlerType          = handlerType;
     HandlerPriority      = MessageHandlerPriorityAttribute.GetPriority(typeof(TMessage), handlerType);
     if (MessageHandlerLifetimeAttribute.GetHandlerLifetime(handlerType) == MessageHandlerLifetime.Singleton)
     {
         _handler = GetIocMessageHandler();
     }
 }
        public void AddHandler(Type messageType, Type handlerType)
        {
            if (_messageHandlerWrappers.Any(handlerWrapper => handlerWrapper.MessageType == messageType && handlerWrapper.HandlerType == handlerType))
            {
                throw new ArgumentException(
                          $"Handler Type {handlerType.Name} already registered for '{messageType.Name}'");
            }

            var messageName = MessageNameAttribute.GetNameOrDefault(messageType);

            if (_messageHandlerWrappers.Any(handlerWrapper => handlerWrapper.MessageName == messageName && handlerWrapper.MessageType != messageType))
            {
                throw new ArgumentException(
                          $"The message name '{messageName}' corresponding to the message type '{messageType}' already exists");
            }

            var handlerWrapperType = typeof(MessageHandlerWrapper <>).MakeGenericType(messageType);

            _messageHandlerWrappers.Add(Activator.CreateInstance(handlerWrapperType, _serviceScopeFactory, handlerType) as IMessageHandlerWrapper);
        }