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

时间:2016-09-22 16:42:30

标签: nservicebus

我们说我有消息

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

是否可以为Type1值构建Saga或者Type2值可以互换,因此所有这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)。下一个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))
}

1 个答案:

答案 0 :(得分:3)

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

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

https://docs.particular.net/samples/saga/nh-custom-sagafinder/https://docs.particular.net/samples/saga/ravendb-custom-sagafinder/的示例。