首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Microsoft.Azure.ServiceBus取代Azure.Messaging.ServiceBus

用Microsoft.Azure.ServiceBus取代Azure.Messaging.ServiceBus
EN

Stack Overflow用户
提问于 2022-08-15 10:07:14
回答 1查看 326关注 0票数 0

我有一个使用Microsoft.Azure.ServiceBus的消息发布者,需要用Azure.Messaging.ServiceBus替换它,因为现在已经不再推荐它了。

以下是代码:

代码语言:javascript
复制
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);
    }
    }
    }

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

出版商的注册方式如下:

代码语言:javascript
复制
services.AddSingleton<ITopicClient>(x => new TopicClient(Configuration["ServiceBus:ConnectionString"], Configuration["ServiceBus:TopicName"]));
services.AddSingleton<IMessagePublisher, MessagePublisher>();

并按需要注入。

我想要做的只是更改消息发布程序中的代码,这样就不需要在使用它的代码中进行更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 07:34:05

如果您只使用迁移指南,您最终将得到

代码语言:javascript
复制
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,请尝试:

代码语言:javascript
复制
services.AddSingleton<IMessagePublisher>(p => 
        new MessagePublisher(
        new ServiceBusClient(Configuration["ServiceBus:ConnectionString"]).CreateSender(Configuration["ServiceBus:TopicName"])));

注意:还有其他方法来注册消息发布者,请参阅如何注册ServiceBusClient以进行依赖注入?。不过,您可能需要对MessagePublisher进行一些小的修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73359526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档