public RabbitMqReceiveTransport(IRabbitMqHost host, ReceiveSettings settings, IManagementPipe managementPipe, ExchangeBindingSettings[] bindings, ISendEndpointProvider sendEndpointProvider, IPublishEndpointProvider publishEndpointProvider)
        {
            _host = host;
            _settings = settings;
            _bindings = bindings;
            _sendEndpointProvider = sendEndpointProvider;
            _publishEndpointProvider = publishEndpointProvider;
            _managementPipe = managementPipe;

            _receiveObservable = new ReceiveObservable();
            _receiveTransportObservable = new ReceiveTransportObservable();

            _inputAddress = _settings.GetInputAddress(_host.Settings.HostAddress);
        }
        async Task IFilter <ModelContext> .Send(ModelContext context, IPipe <ModelContext> next)
        {
            if (IsFirstTime(context))
            {
                await DeclareExchange(context).ConfigureAwait(false);

                if (_settings.BindToQueue)
                {
                    await DeclareAndBindQueue(context).ConfigureAwait(false);
                }

                for (int i = 0; i < _exchangeBindings.Length; i++)
                {
                    ExchangeBindingSettings binding = _exchangeBindings[i];

                    ExchangeSettings exchange = binding.Exchange;

                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("Exchange: {0} ({1})", exchange.ExchangeName,
                                         string.Join(", ", new[]
                        {
                            exchange.Durable ? "durable" : "",
                            exchange.AutoDelete ? "auto-delete" : ""
                        }.Where(x => !string.IsNullOrWhiteSpace(x))));
                    }

                    await context.ExchangeDeclare(exchange.ExchangeName, exchange.ExchangeType, exchange.Durable, exchange.AutoDelete,
                                                  exchange.Arguments).ConfigureAwait(false);

                    await context.ExchangeBind(exchange.ExchangeName, _settings.ExchangeName, binding.RoutingKey, new Dictionary <string, object>()).ConfigureAwait(false);

                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("Exchange:Exchange Binding: {0} ({1})", exchange.ExchangeName, _settings.ExchangeName);
                    }
                }
            }

            await next.Send(context).ConfigureAwait(false);
        }