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

Nservicebus 需要在Saga数据和Saga消息之间进行更复杂的自定义映射,nservicebus,Nservicebus,假设我有消息 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

假设我有消息

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)。下一条消息3现在与BB值重叠。如果新消息Message4带有Type1=CC、Type2=null,则将创建新的传奇

只有2个特定的类型值组合是可能的,因此AA总是与BB一起出现,CC总是与DD一起出现,EE与FF一起出现等。例如,AA永远不会与CC一起出现。Saga事先不知道所有这些类型值组合对,因此接收(AA,null)不能基于(AA,BB)创建Saga,BB在这一步不知道

如果我能够构建自定义代码来获取正确的传奇故事,我会想出类似的方法(跳过空检查):

publicsagagetsaga(ISagaMessage消息)
{
IList existibgSagas=GetExistingSagas();
返回existibgSagas.FirstOrDefault(
s=>s.Type1==message.Type1 | | s.Type1==message.Type2 |
s、 类型2==message.Type1 | | s.Type2==message.Type2))
}

这在默认的saga finder实现中是不可能的,但您可以提供自己的自定义IFindSagas实现。这可能会奏效

请访问查看文档


示例位于和。

这在默认的saga finder实现中是不可能的,但您可以提供自己的自定义IFindSagas实现。这可能会奏效

请访问查看文档


样本位于和。

是的,我看到了,我只是认为一定有比将Saga实现绑定到数据库提供程序更好的解决方案。无论如何,谢谢。记住,你可以有很多传奇故事。您发布的伪代码省略了GetExistingSagas()的实现。加载每个saga实例来运行匹配逻辑可能非常昂贵。最好使用底层数据存储提供的任何机制来尽可能高效地执行查询。例如,通过索引等进行查找。性能更好,但耦合更紧密。总是一种权衡!:)是的,我看到了,我只是认为一定有比将Saga实现绑定到数据库提供者更好的解决方案。无论如何,谢谢。记住,你可以有很多传奇故事。您发布的伪代码省略了GetExistingSagas()的实现。加载每个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))
}