private void DoAddSubscriber(
            Type handlerType,
            Type messageType,
            string messageName,
            bool isDynamic)
        {
            Assert.NotNull(handlerType, nameof(handlerType));
            Assert.NotNullOrEmpty(messageName, nameof(messageName));

            if (!_subscribers.ContainsKey(messageName))
            {
                _subscribers.Add(messageName, _subscriberCollection.New());
            }

            if (_subscribers[messageName].Any(s => s.MessageHandlerType == handlerType))
            {
                throw new ArgumentException(
                          $"Handler Type {handlerType.Name} already registered for '{messageName}'", nameof(handlerType));
            }

            if (isDynamic)
            {
                _subscribers[messageName].Add(MessageSubscriberDescriptor.Dynamic(messageName, handlerType));
            }
            else
            {
                Assert.NotNull(messageType, nameof(messageType));

                _subscribers[messageName].Add(MessageSubscriberDescriptor.Typed(messageType, handlerType));
            }
        }
 public void Unsubscribe <TMessage, TMessageHandler>()
     where TMessage : IMessage
     where TMessageHandler : IMessageHandler <TMessage>
 {
     DoRemoveSubcriber(GetMessageName <TMessage>(), MessageSubscriberDescriptor.Typed(typeof(TMessage), typeof(TMessageHandler)));
 }