2016-09-22 46 views
0

比方说,我有消息需要佐贺数据和佐贺消息之间更复杂的自定义映射

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

是否有可能建立佐贺为类型1的值或者2型值是相互互换,所以这一切都是3个消息应该工作在相同的佐贺:

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

所需的方案:一是消息创建佐贺(AA,空),那么消息2坐上同一佐贺,因为其对型(AA,BB)的与(AA重叠挂钩,空)由元素AA。接下来的消息3现在与BB值重叠。如果新消息Message4进入Type1 = CC,Type2 = null,则会创建新的Saga。

只有2个特定类型值的组合是可能的,所以AA总是带有BB,CC总是带DD,EE带FF等。例如,AA决不会带CC。佐贺不知道所有这些类型值组合的前期,所以接收(AA,null)它不能创建基于(AA,BB)的佐贺,BB在这一步是未知的

如果我能够构建自定义代码拿起右佐贺我会想出这样的事情(跳过空检查):

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)) 
} 

回答

3

那是不可能的,默认的传奇取景器实现,但您可以提供自己的自定义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/

+0

是的,我看到了,我只是觉得必须有比将Saga实现绑定到数据库提供者更好的解决方案。无论如何感谢 – YMC

+1

那么,请记住,你可以有很多传奇故事。您发布的伪代码省略了GetExistingSagas()的实现。加载每个saga实例来运行匹配逻辑可能非常昂贵。使用底层数据存储所提供的任何机制来尽可能高效地执行查询会更好。例如通过索引查找等。更好的性能,但更紧密的耦合。总是一个权衡! :) – janovesk