簡體   English   中英

用 Azure.Messaging.ServiceBus 替換 Microsoft.Azure.ServiceBus

[英]Replacing Microsoft.Azure.ServiceBus with Azure.Messaging.ServiceBus

我有一個使用 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>();

並根據需要注入。

我想要做的是僅更改消息發布器中的代碼,以便不需要在使用它的代碼中進行任何更改。

如果您只是使用遷移指南,您最終會得到

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

注意:還有其他注冊消息發布者的方法,請參見如何注冊ServiceBusClient進行依賴注入? . 不過,您可能需要對MessagePublisher進行一些小的修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM