Saga 数据和 Saga 消息之间需要更复杂的自定义映射

Need more complex custom mapping between Saga data and Saga message

假设我有消息

public interface ISagaMessage
{
    string Type1 { get; set; }
    string Type2 { get; set; }
    ...
}

是否可以为 Type1 值或 Type2 值构建可互换的 Saga,以便所有这 3 条消息都应该在同一个 Saga 下工作:

Message1: Type1 = AA, Type2 = null
Message2: Type1 = AA, Type2 = BB
Message3: Type1 = BB, Type2 = null

期望的场景:第一条消息创建 Saga (AA,null),然后 Message2 挂接到同一个 Saga,因为它的类型对 (AA,BB) 与元素 AA 与 (AA,null) 重叠。 Next Message3 现在被 BB 值重叠。如果新消息 Message4 带有 Type1 = CC,Type2 = null,将创建新的 Saga。

只能有2种特定的类型值组合,所以AA总是带BB,CC总是带DD,EE带FF等。例如AA永远不会带CC。 Saga 事先不知道所有这些类型值组合,所以接收 (AA,null) 它不能基于 (AA,BB) 创建 Saga,BB 在这一步是未知的

如果我能够构建自定义代码来选择正确的 Saga,我会想出这样的东西(跳过空检查):

public Saga GetSaga(ISagaMessage message)
{
   IList<Saga> existibgSagas = GetExistingSagas();
   return existibgSagas.FirstOrDefault(
              s => s.Type1 == message.Type1 || s.Type1 == message.Type2 || 
              s.Type2 == message.Type1 || s.Type2 == message.Type2))
}

默认的 saga finder 实现无法做到这一点,但您可以提供自己的自定义 IFindSagas 实现。这可能会成功。

https://docs.particular.net/nservicebus/sagas/saga-finding 查看文档。

样本位于 https://docs.particular.net/samples/saga/nh-custom-sagafinder/ and https://docs.particular.net/samples/saga/ravendb-custom-sagafinder/