将 NServiceBus Saga 与 ConversationId 相关联

Correlating an NServiceBus Saga with ConversationId

我目前有一些在基本消息上传递自定义 CorrelationId 的 sagas class。所有事件和命令都继承自该基础 class,因此可以轻松访问 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 });
   }

我想知道我是否可以使用 NSB ConversationId 消息 header 来替换自定义 CorrelationId,因为我相信 NSB 已经自动将其从消息映射到消息。

我有两个与此相关的问题:
1. 这听起来合理吗?
2. 如果是,是否有一种简单的方法来设置 ConfigureMapping 映射,以便 saga 从 context.MessageHeaders[Headers.ConversationId] 中读取而不是直接从消息 [=28= 上的 属性 中读取]?我意识到我可以编写自定义 SagaFinder 来深入研究 headers 并获取 ConversationId 并使用它来查找 saga。但是,我认为如果我需要为每个 saga 都这样做,那么整个方法可能是错误的。 谢谢

saga 映射 属性 的目的是从业务方面为 Saga 提供唯一标识符,即银行交易、订单 id、claimid,或者另一个例子可能是贷款 id。所以依赖技术标识符听起来你走错了方向......

关于这些传奇故事,您的商业故事是什么?