带有 DI 的 Azure 服务 IMessageSender

时间:2021-04-26 01:29:52

标签: c# dependency-injection service servicebus

我正在使用 .net 核心项目。

我像这样实现了 DI:

builder.Services.AddSingleton<IMessageSender>(x => new 
    MessageSender(Environment.GetEnvironmentVariable("ServiceBusConnection"),"queueName"));
var serviceprovider = builder.Services.BuildServiceProvider();

ServiceBusUtils.Configure(serviceprovider.GetService<IMessageSender>());

另外,我有一个实用程序类:

public static class ServiceBusUtils
{
  
    private static IMessageSender _messageSender;

  
    public static void Configure(IMessageSender messageSender)
    {
        _messageSender = messageSender;
    }

    
    public static async Task<bool> SendMessage(ExecuteMessage<Message> message ,string queueName,string Id)
    {
       

        var message = new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Message)))
        {
            SessionId = Id,
        };

        await _messageSender.SendAsync(message);

        return true;
    }
}

但我无法使用参数设置 queuename

我想使用类似的实现

ServiceBusUtils.SendMessage(message,"quename");

1 个答案:

答案 0 :(得分:0)

您必须注册命名客户端才能与多个队列名称一起使用。下面的代码会给你一个想法。

public void ConfigureServices(IServiceCollection services)
{
    var queueNames = new string[] { "q1", "q2" };
    var queueFactory = new Dictionary<string, IMessageSender>();
            
    foreach (var queueName in queueNames)
    {
        queueFactory.Add(queueName, new MessageSender(Environment.GetEnvironmentVariable("ServiceBusConnection"),queueName));
    }

    services.AddSingleton(queueFactory);
    services.AddSingleton<IServiceBus,ServiceBus>();
}


public interface IServiceBus
{
    public Task SendMessage(string message, string queue);
}


public class ServiceBus : IServiceBus
{
    private readonly Dictionary<string, IMessageSender> _queueFactory;

    public ServiceBus(Dictionary<string, IMessageSender> queueFactory)
    {
        _queueFactory = queueFactory;
    }
    public async Task SendMessage(string message, string queue)
    {
        var messageSender = _queueFactory[queue];
        await messageSender.SendAysnc(message);
    }
}

您可以将队列名称传递给您的发送消息方法。这将为命名队列解析您的 MessageSender 实例。

_serviceBus.SendMessage("message","q1");