Использование нескольких строк подключения с Rebus & AzureServiceBus
Мы использовали Rebus для отправки команд в служебную шину Azure. У нас есть проект, который охватывает среды и должен посылать команды в два разных пространства имен ASB (разные строки подключения).
То, как мы в настоящее время регистрируем Rebus, не позволяет нам создавать фабрику или использовать несколько пространств имен (о которых я знаю).
Внутри метода Startup.cs ConfigureServices (...):
services.AddRebus(config =>
{
var asbConfig = Configuration.GetSection("AzureServiceBusConfiguration").Get<AzureServiceBusConfiguration>();
config
.Logging(l => l.Serilog(Log.Logger))
.Transport(t => t.UseAzureServiceBusAsOneWayClient(asbConfig.ConnectionString))
.Routing(r => r.TypeBased().Map<MyCommand>($"{asbConfig.Environment}/myQueueName"));
return config;
});
Я пытался атаковать это с нескольких разных направлений, и все потерпели неудачу. Существует ли поддерживаемый способ регистрации более одной конфигурации IBus с разными строками подключения?
Нам в основном нужно увеличивать это в зависимости от объема запроса, чтобы мы могли настроить Rebus на основе значения заголовка запроса. Не уверен, с чего начать.
1 ответ
Хотя Rebus имеет довольно хорошую поддержку для вставки себя в контейнер IoC с помощью концепции "контейнерного адаптера", не всегда имеет смысл всегда делать это автоматически.
В этом случае я предлагаю вам обернуть односторонних клиентов выделенным классом, например что-то вроде CommandSender
или что-то еще, а затем отправитель команды может инициализировать своего одностороннего клиента в конструкторе (и снова разместить его в своем Dispose
метод).
Односторонние клиенты довольно недороги в создании, поэтому может быть достаточно просто создавать / распоряжаться ими каждый раз, когда они вам нужны. Если вы нуждаетесь в них часто, я предлагаю вам использовать ConcurrentDictionary
чтобы сохранить инициализированные экземпляры - просто не забудьте утилизировать их все, когда ваше приложение закрывается.