/// <inheritdoc />
        public override async Task <TransportInfrastructure> Initialize(HostSettings hostSettings,
                                                                        ReceiveSettings[] receivers, string[] sendingAddresses, CancellationToken cancellationToken = default)
        {
            var serviceBusClientOptions = new ServiceBusClientOptions()
            {
                TransportType = UseWebSockets ? ServiceBusTransportType.AmqpWebSockets : ServiceBusTransportType.AmqpTcp,
                EnableCrossEntityTransactions = TransportTransactionMode == TransportTransactionMode.SendsAtomicWithReceive
            };

            if (RetryPolicyOptions != null)
            {
                serviceBusClientOptions.RetryOptions = RetryPolicyOptions;
            }

            var recieveClientTuple = receivers.Select(receiver =>
            {
                var client = TokenCredential != null
                    ? new ServiceBusClient(ConnectionString, TokenCredential, serviceBusClientOptions)
                    : new ServiceBusClient(ConnectionString, serviceBusClientOptions);
                return(receiver, client);
            }).ToArray();

            var defaultClient = TokenCredential != null
                ? new ServiceBusClient(ConnectionString, TokenCredential, serviceBusClientOptions)
                : new ServiceBusClient(ConnectionString, serviceBusClientOptions);

            var administrativeClient = TokenCredential != null ? new ServiceBusAdministrationClient(ConnectionString, TokenCredential) : new ServiceBusAdministrationClient(ConnectionString);

            var namespacePermissions = new NamespacePermissions(administrativeClient);

            var infrastructure = new AzureServiceBusTransportInfrastructure(this, hostSettings, recieveClientTuple, defaultClient, administrativeClient, namespacePermissions);

            if (hostSettings.SetupInfrastructure)
            {
                var queueCreator = new QueueCreator(this, administrativeClient, namespacePermissions);
                var allQueues    = infrastructure.Receivers
                                   .Select(r => r.Value.ReceiveAddress)
                                   .Concat(sendingAddresses)
                                   .ToArray();

                await queueCreator.CreateQueues(allQueues, cancellationToken).ConfigureAwait(false);
            }

            return(infrastructure);
        }
#pragma warning disable CS0672 // Member overrides obsolete member
        public override string ToTransportAddress(QueueAddress address) => AzureServiceBusTransportInfrastructure.TranslateAddress(address);