【问题标题】:Azure Service IMessageSender with DI带有 DI 的 Azure 服务 IMessageSender
【发布时间】:2021-04-26 01:29:52
【问题描述】:

我正在使用 .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");

【问题讨论】:

  • 你在哪里配置你的 ServiceBusUtils.Configure(serviceprovider.GetService());?
  • 在启动类中我将配置连接字符串和队列名称,但我想设置多个队列名称(动态)
  • 有什么理由使用 ServiceBusUtils 作为静态类?
  • 如果可能的话,是的,但我想看看其他解决方案。

标签: c# dependency-injection service servicebus


【解决方案1】:

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

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");

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 2023-04-03
    • 2016-03-05
    • 2018-12-10
    • 2017-08-28
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多