.net core Azure服务总线-在web API中使用多个发件人

.net core Azure服务总线-在web API中使用多个发件人,.net-core,azureservicebus,azure-servicebus-queues,azure-servicebus-topics,.net Core,Azureservicebus,Azure Servicebus Queues,Azure Servicebus Topics,我们正在尝试实施Azure服务总线来管理用户“工作队列” 背景: 我们有一个web UI,它将新项目推送到一个web API,该API被持久化到一个DB,然后推送到一个服务总线队列。所有消息都有一个属性,表示谁可以处理该消息。为了让用户能够选择分配给他们的消息,我考虑创建一个主题,其中包含对该属性进行筛选的订阅 方法 要实现上述能力: 我需要在同一Web API中注册队列的发送者和主题的发送者。我曾尝试将这两个发送者添加为单例,但在DI期间,我如何选择使用哪个发送者 services.Try

我们正在尝试实施Azure服务总线来管理用户“工作队列”

背景:

我们有一个web UI,它将新项目推送到一个web API,该API被持久化到一个DB,然后推送到一个服务总线队列。所有消息都有一个属性,表示谁可以处理该消息。为了让用户能够选择分配给他们的消息,我考虑创建一个主题,其中包含对该属性进行筛选的订阅

方法

要实现上述能力:

  • 我需要在同一Web API中注册队列的发送者和主题的发送者。我曾尝试将这两个发送者添加为单例,但在DI期间,我如何选择使用哪个发送者
services.TryAddSingleton(实现工厂=>
{
var serviceBusConfiguration=implementationFactory.GetRequiredService();
var serviceBusClient=新serviceBusClient(serviceBusConfiguration.IntakeQueueSendConnectionString);
var serviceBusSender=serviceBusClient.CreateSender(serviceBusConfiguration.IntakeQueueName);
返回serviceBusSender;
});
services.TryAddSingleton(实现工厂=>
{
var serviceBusConfiguration=implementationFactory.GetRequiredService();
var serviceBusClient=新serviceBusClient(serviceBusConfiguration.TopicConnectionString);
var topicSender=serviceBusClient.CreateSender(serviceBusConfiguration.TopicName);
返回主题搜索器;
});
我使用上述设置将服务添加为单例,并且我能够单独发送和接收来自主题或队列的消息


当我在构造函数中使用DI来使用它时,如何注册这两个实现并选择应该注入的实现。

关于解决同一类型的多个实例的DI注册问题,的第一个答案演示了如何使用ASP.NET核心的服务解析程序。据我所知,这仍然是最好的办法

对于发件人,您可以通过检查他们的属性来识别他们是否指向您的队列或主题来进行区分

services.TryAddSingleton(implementationFactory =>
{
    var serviceBusConfiguration = implementationFactory.GetRequiredService<IMessagingServiceConfiguration>();
    var serviceBusClient = new ServiceBusClient(serviceBusConfiguration.IntakeQueueSendConnectionString);
    var serviceBusSender = serviceBusClient.CreateSender(serviceBusConfiguration.IntakeQueueName);
    return serviceBusSender;
});


services.TryAddSingleton(implementationFactory =>
{
    var serviceBusConfiguration = implementationFactory.GetRequiredService<IMessagingServiceConfiguration>();
    var serviceBusClient = new ServiceBusClient(serviceBusConfiguration.TopicConnectionString);
    var topicSender = serviceBusClient.CreateSender(serviceBusConfiguration.TopicName);
    return topicSender;
});