1

我目前有一些 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 都这样做,那么整个方法可能是错误的。谢谢

4

1 回答 1

2

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

您对这些传奇的商业故事是什么?

于 2019-10-11T14:47:55.163 回答