我们说我有消息
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))
}
答案 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/的示例。