public static void Validate(BrokerFactoryConfiguration configuration)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            if (string.IsNullOrWhiteSpace(configuration.Url))
            {
                if (string.IsNullOrWhiteSpace(configuration.HostName))
                {
                    throw new ArgumentException($"{nameof(configuration.HostName)} is missing.");
                }

                if (configuration.HostPort <= 0)
                {
                    throw new ArgumentException($"{nameof(configuration.HostPort)} is missing.");
                }

                if (string.IsNullOrWhiteSpace(configuration.UserName))
                {
                    throw new ArgumentException($"{nameof(configuration.UserName)} is missing.");
                }

                if (string.IsNullOrWhiteSpace(configuration.Password))
                {
                    throw new ArgumentException($"{nameof(configuration.Password)} is missing.");
                }
            }

            if (configuration.NetworkRecoveryIntervalSeconds < 0)
            {
                throw new ArgumentException($"{nameof(configuration.NetworkRecoveryIntervalSeconds)} can not be less than 0.");
            }

            if (string.IsNullOrWhiteSpace(configuration.DefaultDeadLetterExchange))
            {
                throw new ArgumentException($"{nameof(configuration.DefaultDeadLetterExchange)} is missing.");
            }

            if (string.IsNullOrWhiteSpace(configuration.DefaultDeadLetterQueue))
            {
                throw new ArgumentException($"{nameof(configuration.DefaultDeadLetterQueue)} is missing.");
            }
        }
        /// <summary>
        /// BrokerFactory constructor.
        /// </summary>
        /// <exception cref="ArgumentNullException">Thrown, if the configuration is wrong.</exception>
        /// <exception cref="ArgumentException">Thrown, if the configuration is wrong.</exception>
        public BrokerFactory(
            BrokerFactoryConfiguration configuration,
            IAttributeProvider <MessageSettingsAttribute> attributeProvider = null)
        {
            BrokerFactoryConfiguration.Validate(configuration);

            if (string.IsNullOrWhiteSpace(configuration.Url))
            {
                _connectionFactory = new ConnectionFactory
                {
                    HostName    = configuration.HostName,
                    Port        = configuration.HostPort,
                    VirtualHost = configuration.VirtualHost,
                    UserName    = configuration.UserName,
                    Password    = configuration.Password,
                    AutomaticRecoveryEnabled = configuration.NetworkRecoveryIntervalSeconds > 0,
                    NetworkRecoveryInterval  = TimeSpan.FromSeconds(configuration.NetworkRecoveryIntervalSeconds)
                };
            }
            else
            {
                _connectionFactory = new ConnectionFactory
                {
                    Uri = new Uri(configuration.Url),
                    AutomaticRecoveryEnabled = configuration.NetworkRecoveryIntervalSeconds > 0,
                    NetworkRecoveryInterval  = TimeSpan.FromSeconds(configuration.NetworkRecoveryIntervalSeconds)
                };
            }

            _factoryConfiguration = configuration;

            _attributeProvider = attributeProvider ?? new SimpleAttributeProvider <MessageSettingsAttribute>();

            _lazyConnection = new Lazy <IConnection>(createConnection);

            _attributesDic = new ConcurrentDictionary <Type, MessageSettingsAttribute>();
        }