2017-02-11 72 views
1

我有一個與域驅動設計中聚合關係相關的問題。域驅動設計中的聚合關係

我有以下情況:我有一個聚合(問卷),其中有一些兒童(問題)。這些問題是實體,但是因爲它們在問卷集合內部,所以它們可以具有本地身份(即在ID爲1234的問卷中使用ID爲1的問題;在另一個問卷中,我可以在ID爲1的情況下有另一個問題)。因此,要提及問題,您必須始終使用其父問卷ID進行限定。

另一方面,我有另一個聚合(收集活動),它存儲問卷中的問題數據(回答集)(收集活動通過它的id指向問卷,並且回答集再次指向問題由它的id)。我可以有幾個收集活動(可能在不同的時間發生),每個收集活動存儲不同的迴應集,但對於相同的問卷(和問題)。

所以我的問題是:我設計得很好(根據DDD)?或者,我是否必須將問卷調查和問題作爲單獨的集合,以便從收集活動/響應集中引用它們?

我希望這是有道理的,謝謝。

+0

查看我的更新回答 –

回答

1

問問自己:應該保護哪些不變量?

對於您的情況,您必須確保在活動期間回答的問題存在(即其索引在問卷中的問題數量爲0和0之間)並且是允許的問題;其他不變則可能是在回答至少一個問題後不得修改問卷;在任何這些情況下,活動必須與詢問者同步。我看至少2個解決方案:

  1. 最簡單的解決辦法是有一個很大的總量,在總量Questionare,帶着疑問,campaignes和答案作爲子實體這樣可以保護那些不變量;這有一些性能影響,但只有你應該知道這是可以接受的。

  2. 第二個解決方案是使用事件驅動架構,如CQRS + Event Sourcing。在這種情況下,您可以分開彙總並使用簡單的Saga將它們保持同步,該彙總將Questionare彙總(如QuestionAdded,QuestionRemoved)中的某些事件轉發給Campaingn彙總。我更喜歡這個解決方案來更好地區分責任。

+0

那麼問卷之外的問題本身是沒有意義的。這是不是值得保護的不變性?而且,如果我們假設情況是這樣的話,那麼如何在收集活動聚集內的「問卷彙總」之外「參考」問題以鏈接響應集?我試圖弄清楚這一點,但我需要幫助。 –