public EventBusRabbitMQ(
            EventBusConfiguration configuration,
            EventBusRabbitMQConfiguration rabbitmqConfiguration,
            EventBusRabbitMQConnection eventBusConnection,
            EventBusRabbitMQRetryConsumerStrategy retryConsumerStrategy,
            EventBusManager manager,
            ILogger <EventBusRabbitMQ> logger)
        {
            _configuration         = configuration ?? throw new ArgumentNullException(nameof(configuration));
            _rabbitmqConfiguration = rabbitmqConfiguration ?? throw new ArgumentNullException(nameof(rabbitmqConfiguration));
            _exchangeName          = rabbitmqConfiguration.ExchangeName;
            _queueName             = rabbitmqConfiguration.QueueName;
            _eventBusConnection    = eventBusConnection ?? throw new ArgumentNullException(nameof(eventBusConnection));
            _manager = manager ?? throw new ArgumentNullException(nameof(manager));
            _retryConsumerStrategy = retryConsumerStrategy ?? throw new ArgumentNullException(nameof(retryConsumerStrategy));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));

            using (var channel = _eventBusConnection.CreateModel())
            {
                channel.ExchangeDeclare(
                    exchange: _exchangeName,
                    type: ExchangeType.Direct,
                    arguments: new Dictionary <string, object>()
                {
                    { "x-dead-letter-exchange", $"{_exchangeName}{_configuration.FailSuffix}" }
                });
            }
        }
        public EventBusRabbitMQConnectionFactory(
            EventBusRabbitMQConfiguration configuration)
        {
            _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));

            HostName               = _configuration.HostName;
            Port                   = _configuration.Port;
            VirtualHost            = _configuration.VirtualHost;
            UserName               = _configuration.UserName;
            Password               = _configuration.Password;
            DispatchConsumersAsync = true;
        }