我目前有一些 sagas 在基本消息类上传递自定义 CorrelationId。所有事件和命令都继承自该基类,因此可以轻松访问 CorrelationId。结果,ConfigureHowToFindSaga
映射看起来像这样:
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MySagaData> mapper)
{
mapper.ConfigureMapping<MyCommand>(message => message.CorrelationId)
.ToSaga(sagaData => sagaData.CorrelationId);
mapper.ConfigureMapping<MyEvent>(message => message.CorrelationId)
.ToSaga(sagaData => sagaData.CorrelationId);
}
在 saga 的每个步骤(以及 saga 与之通信的其他服务)中,自定义 CorrelationId 当前手动从消息映射到消息,如下所示:
public Task Handle(MyCommand message, IMessageHandlerContext context)
{
// do something
return context.Publish(new MyEvent { CorrelationId = message.CorrelationId });
}
我想知道是否可以使用 NSBConversationId
消息头来替换自定义 CorrelationId,因为我相信 NSB 已经自动将其从消息映射到消息。
我对此有两个问题:
1. 这听起来合理吗?
2. 如果是这样,是否有一种简单的方法设置ConfigureMapping
映射,以便 saga 从context.MessageHeaders[Headers.ConversationId]
消息正文中的属性读取而不是直接从属性读取?我意识到我可以编写一个自定义 SagaFinder 来挖掘标题并获取 ConversationId 并使用它来查找 saga。但是,我认为如果我需要为每个 saga 都这样做,那么整个方法可能是错误的。谢谢