迁移指南:从 Brighter V9 升级到 V10

在[之前的文章中,我讨论了 Brighter V10 及其新特性。本篇补充文章重点介绍从 V9 到 V10 的必要迁移路径,强调重大变更并提供更新的代码示例。

依赖注入注册

您将遇到的第一个也是最重要的变化之一是 Brighter 如何注册到 Microsoft DI 容器中。AddServiceActivator 方法已被弃用,取而代之的是针对消费者和生产者的更具体方法。

消息消费者和生产者设置

在 V9 中,您通常对消费者使用 AddServiceActivator。在 V10 中,此注册现在明确拆分为 AddConsumers 和 AddProducers,使您可以更精细地控制。

另外请注意,opt.ChannelFactory 已重命名为 opt.DefaultChannelFactory

V9

services
    .AddServiceActivator(opt => 
    {
        opt.Subscriptions = [...];
        opt.ChannelFactory = new ChannelFactory(...);
    })
    .UseExternalBus(...)

V10

services
    .AddConsumers(opt => 
    {
        opt.Subscriptions = [...];
        opt.DefaultChannelFactory = new ChannelFactory(...);
    })
    .AddProducers(opt =>
    {
        opt.ProducerRegistry = ....
    });

收件箱和发件箱配置

以前,您通过在 AddServiceActivator 后链接 UseInMemoryInbox() 等方法来配置收件箱和发件箱。在 V10 中,此配置已直接移至 AddConsumers(用于收件箱)和 AddProducers(用于发件箱)选项中。

在 V10 中配置发件箱时,您现在还必须显式配置 ConnectionProvider 和 TransactionProvider

V9

services
    .AddServiceActivator(opt => 
    {
        opt.Subscriptions = [...];
        opt.ChannelFactory = new ChannelFactory(...);
    })
    .UseInMemoryInbox()
    .UseInMemoryOutbox()
    .UseExternalBus(...)

V10

services
    .AddConsumers(opt => 
    {
        opt.Subscriptions = [...];
        opt.InboxConfiguration = new InboxConfiguration(...);
        opt.DefaultChannelFactory = new ChannelFactory(...);
    })
    .AddProducers(opt =>
    {
        opt.ProducerRegistry = ....;
        opt.Outbox = ...;
        opt.ConnectionProvider = typeof(...);
        opt.TransactionProvider = typeof(...);
    });

组件生命周期

在 V10 中,强烈建议将消息映射器(Message Mappers)、转换器(Transformers)和请求处理器(Request Handlers)注册为 ScopedTransient

这是因为这些组件现在通常包含 RequestContext 属性。该属性在运行时(方法调用前)由框架更新,使用 Singleton 生命周期可能导致并发问题和数据过期。

消息映射器接口

IAmAMessageMapper 接口有两个关键的重大变更。

1. MapToMessage 签名:该方法现在包含一个 Publication 参数:MapToMessage(Greeting request, Publication publication)。这是支持新的默认映射器功能所必需的。
2. RequestContext 属性:接口现在要求一个 public IRequestContext? Context { get; set; } 属性。这允许框架或请求者在运行时传递额外的上下文和数据。

V9

public class GreetingMapper : IAmAMessageMapper<Greeting>
{
    public Message MapToMessage(Greeting request)
    {
        var header = new MessageHeader();
        header.Id = request.Id;
        header.TimeStamp = DateTime.UtcNow;
        header.Topic = "greeting.topic";
        header.MessageType = MessageType.MT_EVENT;

        var body = new MessageBody(JsonSerializer.Serialize(request));
        return new Message(header, body);
    }

    public Greeting MapToRequest(Message message)
    {
        return JsonSerializer.Deserialize<Greeting>(message.Body.Bytes)!;
    }
}

V10

public class GreetingMapper : IAmAMessageMapper<Greeting>
{
    public IRequestContext? Context { get; set; }

    public Message MapToMessage(Greeting request, Publication publication)
    {
        var header = new MessageHeader();
        header.Id = request.Id;
        header.TimeStamp = DateTime.UtcNow;
        header.Topic = "greeting.topic";
        header.MessageType = MessageType.MT_EVENT;

        var body = new MessageBody(JsonSerializer.Serialize(request));
        return new Message(header, body);
    }

    public Greeting MapToRequest(Message message)
    {
        return JsonSerializer.Deserialize<Greeting>(message.Body.Bytes)!;
    }
}

异步映射器

一个微妙但重要的相关变更:如果您使用 RequestHandlerAsync(用于异步处理器),现在必须实现相应的 IAmAMessageMapperAsync 接口,而不是同步的 IAmAMessageMapper

发件箱重大变更

如果您在使用 Brighter V10 的发件箱功能,特别是与关系型数据库(如 PostgreSQLMySQLMicrosoft SQL Server)一起使用,有几个重大的模式变更。

您必须向收件箱/发件箱表中添加以下列,以支持增强的上下文和跟踪:

  • Source: VARCHAR(255)
  • DataSchema: VARCHAR(255)
  • Subject: VARCHAR(255)
  • TraceParent: VARCHAR(255)
  • TraceState: VARCHAR(255)
  • Baggage: TEXT(或 SQL Server 中的 VARCHAR(MAX)

MessageId 列变更

在多个实现中,MessageId 列类型已更新。

  • PostgreSQL: MessageId 类型必须从 UUID 更改为 VARCHAR(255)

可选(推荐)变更:为了获得更好的性能和原生类型使用,您可以进行以下特定于平台的变更:

  • MySQL: MessageId 从 CHAR(36) 更改为 VARCHAR(255)
  • Microsoft SQL Server: 将 MessageId 从 UNIQUEIDENTIFIER 更改为 VARCHAR(255)

迁移策略和最佳实践

从 V9 迁移到 V10 时,请考虑采用以下方法:

  1. 从注册开始:首先更新您的 DI 配置,因为这会影响其他所有内容
  2. 配置收件箱/发件箱:将收件箱/发件箱配置移到适当的注册块中
  3. 更新映射器: 重构所有消息映射器以实现新的接口要求
  4. 审查生命周期:检查所有 Brighter 相关组件,确保它们注册为 Scoped 或 Transient
  5. 彻底测试:特别关注事务管理和异步操作

结论

迁移到 Brighter V10 涉及几个关键变更,主要集中在更清晰的 DI 注册、显式的收件箱/发件箱设置,以及带有请求上下文的增强消息映射。通过如上所示更新您的服务注册和映射器实现,您可以将应用程序平滑过渡到新版本。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值