2017-09-06 198 views
0

我設計採用DDD一個CQRS應用程序,並想知道如何實現以下情形:如何在使用DDD的CQRS架構中使用sagas?

  • 一個Participant骨料可以被多個引用ParticipantEntry聚集
  • AddParticipantInfoCommand發出的命令側,這包含Participant和一個ParticipantEntry的(類似於Order和一個OrderLineItem)所有信息

應該在哪裏邏輯實現爲ch ecks參與者是否已經存在,如果它不存在,創建參與者?

  • 它應該可以在佐賀做到這一點首先檢查域模型的Participant的存在,如果沒有找到它,發出AddParticipantCommand事後含Participant IDAddParticipantEntry命令?
  • 這應該完全由領域模型本身的aggregateroots完成嗎?
+0

「一個參與者聚集可以與多個ParticipantEntry聚集相關」 - 你什麼意思? –

+0

它們是如何關聯的?通過ID?什麼代表這種「關聯」? –

+0

如果在短時間內添加重複的參與者,會發生什麼情況?對業務有什麼影響?人們重試或取消命令是可以接受的嗎? –

回答

2

你不爲了對付這種情況,不一定需要傳奇。看看我的博客文章,爲什麼不創建聚合根,該怎麼做:

http://udidahan.com/2009/06/29/dont-create-aggregate-roots/

+0

確實,域模型本身應該創建依賴實體,而不是命令處理程序(或者您在博客文章中陳述的服務層)。感謝您指點我正確的方向! –

1

在哪裏應該檢查參與者是否已經存在,如果它不存在,創建參與者?

在大多數情況下,此行爲應該受Participant聚合本身的控制。

當您需要協調跨多個事務邊界的更改時,流程非常有用。但是,對同一個聚合的兩個更改可以在同一個事務中進行管理。

可以實施此作爲兩個不同的交易在同一總量上運作,協調;但一個過程的額外複雜性不會帶來任何收益。將單個命令發送到聚合中更容易,並允許它決定採取什麼操作來保持正確的不變量。

特別是,薩加斯是恢復多筆交易的模式。燕翠的How the Saga Pattern manages failures with AWS Lambda and Step Functions包括一個旅遊預訂傳奇的好例子。

(注意:有關於「傳奇」的定義相當混亂;在NServiceBus社會傾向於理解的一個詞語比原先由Garia-Molina and Salem kellabyte的Clarifying the Saga Pattern調查所描述的混亂的方式略有不同)