2016-09-22 73 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