在 Rebus 和 AzureServiceBus 中使用多个连接字符串

Using multiple connection strings with 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 配置?

我们基本上需要根据请求范围进行调整,以便我们可以根据请求 header 值配置 Rebus。不知道从哪里开始。

虽然 Rebus 对通过 "container adapter" 概念将自身插入到 IoC 容器中有很好的支持,但始终让它自动这样做并不一定有意义。

在这种情况下,我建议您将 one-way 客户包装成专用的 class,例如像 CommandSender 之类的东西,然后命令发送者可以在构造函数中初始化它的 one-way 客户端(并在它的 Dispose 方法中再次处理它)。

One-way 客户端的创建成本相当低,因此每次需要它们时只需 create/dispose 就可以了。不过,如果您经常需要它们,我建议您使用 ConcurrentDictionary 来存储初始化的实例——只要记住在您的应用程序关闭时将它们全部释放。