/// <summary>
        /// Create Producer to publish messages.
        /// </summary>
        /// <exception cref="BrokerFactoryException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        public Task <IProducer <T> > CreateProducerAsync <T>(CancellationToken cancelToken = default) where T : class
        {
            MessageSettingsAttribute msgSettings = getAndValidateSettingsFor <T>();

            try
            {
                // --> Create: Model.
                IModel model = _lazyConnection.Value.CreateModel();

                // Create the requested exchange.
                if (!_factoryConfiguration.SkipManagement)
                {
                    model.ExchangeDeclare(msgSettings.ExchangeName, msgSettings.ExchangeType.ToString().ToLower(), true);
                }

                model.ConfirmSelect();

                // --> Create: Producer.
                IProducer <T> producer = new Producer <T>(model, msgSettings.ExchangeName, msgSettings.RouteKey, msgSettings.DeliveryMode);

                return(Task.FromResult(producer));
            }
            catch (Exception ex)
            {
                throw new BrokerFactoryException("Failed to create Producer.", ex);
            }
        }
        /// <summary>
        /// Create Consumer to consume messages.
        /// </summary>
        /// <exception cref="BrokerFactoryException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        public Task <IConsumer <T> > CreateConsumerAsync <T>(CancellationToken cancelToken = default) where T : class
        {
            MessageSettingsAttribute msgSettings = getAndValidateSettingsFor <T>();

            try
            {
                // --> Create: Model.
                IModel model = _lazyConnection.Value.CreateModel();

                if (!_factoryConfiguration.SkipManagement)
                {
                    // --> Initialize: DeadLetterQueue and DeadLetterExchange.
                    string deadLetterQueue = _factoryConfiguration.DefaultDeadLetterQueue;

                    if (!string.IsNullOrWhiteSpace(msgSettings.DeadLetterQueue))
                    {
                        deadLetterQueue = msgSettings.DeadLetterQueue;
                    }

                    model.QueueDeclare(deadLetterQueue, true, false, false);

                    model.ExchangeDeclare(_factoryConfiguration.DefaultDeadLetterExchange, ExchangeType.Direct.ToString().ToLower(), true);

                    model.QueueBind(deadLetterQueue, _factoryConfiguration.DefaultDeadLetterExchange, msgSettings.QueueName);

                    // --> Initialize: The requested Queue.
                    Dictionary <string, object> declareArguments = new Dictionary <string, object>
                    {
                        ["x-dead-letter-exchange"]    = _factoryConfiguration.DefaultDeadLetterExchange,
                        ["x-dead-letter-routing-key"] = msgSettings.QueueName
                    };

                    model.QueueDeclare(msgSettings.QueueName, true, false, false, declareArguments);

                    // Create: Exchange and bind it with the queue.
                    model.ExchangeDeclare(msgSettings.ExchangeName, msgSettings.ExchangeType.ToString().ToLower(), true);
                    model.QueueBind(msgSettings.QueueName, msgSettings.ExchangeName, msgSettings.RouteKey ?? string.Empty);
                }

                // --> Create: Consumer.
                IConsumer <T> consumer = new Consumer <T>(model, msgSettings.QueueName, msgSettings.PrefetchCount);

                return(Task.FromResult(consumer));
            }
            catch (Exception ex)
            {
                throw new BrokerFactoryException("Failed to create Consumer.", ex);
            }
        }