如何解决带有 DI 的 Azure 服务 IMessageSender
我正在使用 .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");
解决方法
您必须注册命名客户端才能与多个队列名称一起使用。下面的代码会给你一个想法。
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");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。