如何将Microsoft.Azure.ServiceBus替换为Azure.Messaging.ServiceBus(仅改发布器)
迁移Microsoft.Azure.ServiceBus到Azure.Messaging.ServiceBus(无需修改调用代码)
完全可以只修改MessagePublisher类和服务注册代码,保持IMessagePublisher接口不变,这样所有调用该发布器的代码都不需要改动。以下是具体步骤:
1. 更新NuGet包
卸载旧的Microsoft.Azure.ServiceBus包,安装新的Azure.Messaging.ServiceBus包。
2. 修改MessagePublisher实现
替换命名空间、调整依赖类型,并适配新库的API:
using Azure.Messaging.ServiceBus; using Newtonsoft.Json; using System; using System.Text; using System.Threading.Tasks; namespace gbx.infra.ware.Services { // 保持IMessagePublisher接口完全不变 public interface IMessagePublisher { Task Publish<T>(T obj); Task Publish(string raw); Task<long> PublishScheduled<T>(T obj, DateTimeOffset time); } public class MessagePublisher : IMessagePublisher { // 替换旧的ITopicClient为新的ServiceBusSender private readonly ServiceBusSender _serviceBusSender; // 构造函数注入ServiceBusSender public MessagePublisher(ServiceBusSender serviceBusSender) { _serviceBusSender = serviceBusSender; } public Task Publish<T>(T obj) { string objAsText = JsonConvert.SerializeObject(obj); // 用ServiceBusMessage替代旧的Message类 var message = new ServiceBusMessage(Encoding.UTF8.GetBytes(objAsText)); // 新库中用ApplicationProperties替代UserProperties message.ApplicationProperties["messageType"] = typeof(T).Name; return _serviceBusSender.SendMessageAsync(message); } public Task Publish(string raw) { var message = new ServiceBusMessage(Encoding.UTF8.GetBytes(raw)); message.ApplicationProperties["messageType"] = "Raw"; return _serviceBusSender.SendMessageAsync(message); } public Task<long> PublishScheduled<T>(T obj, DateTimeOffset time) { string objAsText = JsonConvert.SerializeObject(obj); var message = new ServiceBusMessage(Encoding.UTF8.GetBytes(objAsText)); message.ApplicationProperties["messageType"] = typeof(T).Name; // 新库的ScheduleMessageAsync方法参数和返回值与旧库兼容 return _serviceBusSender.ScheduleMessageAsync(message, time); } } }
3. 更新服务注册代码
把旧的ITopicClient注册替换为ServiceBusSender的注册:
// 先创建ServiceBusClient实例(单例) services.AddSingleton<ServiceBusClient>(x => new ServiceBusClient(Configuration["ServiceBus:ConnectionString"])); // 再注册ServiceBusSender services.AddSingleton<ServiceBusSender>(x => x.GetRequiredService<ServiceBusClient>().CreateSender(Configuration["ServiceBus:TopicName"])); // 保持IMessagePublisher的注册不变 services.AddSingleton<IMessagePublisher, MessagePublisher>();
关键适配点说明
- 新库用
ServiceBusSender替代旧的TopicClient,负责消息发送 - 旧的
Message类替换为ServiceBusMessage,属性UserProperties对应新库的ApplicationProperties SendAsync方法改为SendMessageAsync,ScheduleMessageAsync方法签名与旧库一致,返回值都是long类型的调度消息ID- 所有接口方法签名完全保留,调用方代码无需任何修改
内容的提问来源于stack exchange,提问作者zawisza
相关产品推荐
相关产品推荐

