在[之前的文章中,我讨论了 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)注册为 Scoped 或 Transient。
这是因为这些组件现在通常包含 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 的发件箱功能,特别是与关系型数据库(如 PostgreSQL、MySQL 或 Microsoft 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 时,请考虑采用以下方法:
- 从注册开始:首先更新您的 DI 配置,因为这会影响其他所有内容
- 配置收件箱/发件箱:将收件箱/发件箱配置移到适当的注册块中
- 更新映射器: 重构所有消息映射器以实现新的接口要求
- 审查生命周期:检查所有 Brighter 相关组件,确保它们注册为 Scoped 或 Transient
- 彻底测试:特别关注事务管理和异步操作
结论
迁移到 Brighter V10 涉及几个关键变更,主要集中在更清晰的 DI 注册、显式的收件箱/发件箱设置,以及带有请求上下文的增强消息映射。通过如上所示更新您的服务注册和映射器实现,您可以将应用程序平滑过渡到新版本。
896

被折叠的 条评论
为什么被折叠?



