c# - 将 Microsoft.Azure.ServiceBus 替换为 Azure.Messaging.ServiceBus

标签 c# azure .net-core azure-servicebus-topics

我有一个使用 Microsoft.Azure.ServiceBus 的消息发布者,需要将其替换为 Azure.Messaging.ServiceBus,因为它现已弃用。

这是代码:

using Microsoft.Azure.ServiceBus;
using Newtonsoft.Json;
using System;
using System.Text;
using System.Threading.Tasks;

namespace gbx.infra.ware.Services
{
public interface IMessagePublisher
{
    public Task Publish<T>(T obj);
    public Task Publish(string raw);
    public Task<long> PublishScheduled<T>(T obj, DateTimeOffset time);

}
public class MessagePublisher : IMessagePublisher
{
    private readonly ITopicClient _topicClient;

    public MessagePublisher(ITopicClient topicClient)
    {
        _topicClient = topicClient;
    }

    public Task Publish<T>(T obj)
    {
        string objAsText = JsonConvert.SerializeObject(obj);

        Message message = new Message(Encoding.UTF8.GetBytes(objAsText));
        message.UserProperties["messageType"] = typeof(T).Name;
        return _topicClient.SendAsync(message);
    }

    public Task Publish(string raw)
    {
        Message message = new Message(Encoding.UTF8.GetBytes(raw));
        message.UserProperties["messageType"] = "Raw";
        return _topicClient.SendAsync(message);
    }

    public Task<long> PublishScheduled<T>(T obj, DateTimeOffset time)
    {
        string objAsText = JsonConvert.SerializeObject(obj);

        Message message = new Message(Encoding.UTF8.GetBytes(objAsText));
        message.UserProperties["messageType"] = typeof(T).Name;
        return _topicClient.ScheduleMessageAsync(message, time);
    }
    }
    }

有什么简单的方法可以让我做出改变吗?我找不到这方面的任何信息。

发布者的注册方式如下:

services.AddSingleton<ITopicClient>(x => new TopicClient(Configuration["ServiceBus:ConnectionString"], Configuration["ServiceBus:TopicName"]));
services.AddSingleton<IMessagePublisher, MessagePublisher>();

并根据需要注入(inject)。

我想要做的是仅更改消息发布器中的代码,以便不需要在使用它的代码中进行任何更改。

最佳答案

如果您只是使用 migration guide你最终会得到

public interface IMessagePublisher
{
    public Task Publish<T>(T obj);
    public Task Publish(string raw);
    public Task<long> PublishScheduled<T>(T obj, DateTimeOffset time);

}

public class MessagePublisher : IMessagePublisher
{
    private readonly ServiceBusSender _serviceBusSender;

    public MessagePublisher(ServiceBusSender serviceBusSender)
    {
        _serviceBusSender = serviceBusSender;
    }

    public Task Publish<T>(T obj)
    {
        string objAsText = JsonConvert.SerializeObject(obj);

        ServiceBusMessage message = new ServiceBusMessage(Encoding.UTF8.GetBytes(objAsText));
        message.ApplicationProperties["messageType"] = typeof(T).Name;
        return _serviceBusSender.SendMessageAsync(message);
    }

    public Task Publish(string raw)
    {
        ServiceBusMessage 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);

        ServiceBusMessage message = new ServiceBusMessage(Encoding.UTF8.GetBytes(objAsText));
        message.ApplicationProperties["messageType"] = typeof(T).Name;
        return _serviceBusSender.ScheduleMessageAsync(message, time);
    }
}

要注册MessagePublisher,请尝试:

services.AddSingleton<IMessagePublisher>(p => 
        new MessagePublisher(
        new ServiceBusClient(Configuration["ServiceBus:ConnectionString"]).CreateSender(Configuration["ServiceBus:TopicName"])));

注意:还有其他方法可以注册消息发布者,参见How to register ServiceBusClient for dependency injection? 。不过,您可能需要对 MessagePublisher 进行一些细微修改。

关于c# - 将 Microsoft.Azure.ServiceBus 替换为 Azure.Messaging.ServiceBus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73359526/

相关文章:

c# - 为椭圆添加属性以获取鼠标事件 C#

c# - ConfidentialClientApplication.AcquireTokenForClient().ExecuteAsync() 线程安全吗?

javascript - jQuery 找不到具有指定 id 的元素

c# - 如何保存应用程序设置?

c# - 如何在C#中单击按钮并打开窗口发送电子邮件

c# - 当 JSON 字典为空时,反序列化 JSON 字符串失败

c# - Visual Studio 2013 - 添加项目 > 缺少报告选项

.net - 使用 Fluent sdk 和 Windows 容器启动 Azure 容器实例

azure - 没有为 WebJob 注册路由

azure - Spark、wasb 和 Jetty 11