我们一直在使用Rebus向Azure Service Bus发送命令。我们有一个跨越环境的项目,需要将命令发送到两个不同的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。不知道从哪里开始。
答案 0 :(得分:1)
虽然Rebus对通过“容器适配器”概念将自身插入IoC容器提供了很好的支持,但总是让它自动完成它并不一定有意义。
在这种情况下,我建议你将单向客户端包装成一个专用类,例如像CommandSender
之类的东西,然后命令发送者可以在构造函数中初始化它的单向客户端(并在其Dispose
方法中再次处理它。)
单向客户端的创建成本相当低,因此只需在每次需要时创建/部署它们都可以。如果您经常需要它们,我建议您使用ConcurrentDictionary
来存储已初始化的实例 - 只需记住在应用程序关闭时将它们全部丢弃。