You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:45:32