2011-09-08 44 views
2

我陷入了分析癱瘓的漩渦中,試圖將DDD應用到我以前開發的各種應用程序或計劃在將來進行的各種 應用程序。確定聚集根的幫助

讓我們舉一個簡單的壘球聯盟。我們有聯盟, 屬於聯盟(只有一個)的球隊,以及屬於單個球隊的球員。我知道 這些規則可能會有所不同,但只是假裝。

我看到這是一個團隊不能存在沒有聯盟,如果你刪除一個聯盟,你刪除所有屬於它的球隊(以及球員),所以我有 一個聚合在這裏與根是聯盟。現在的團隊也是一個重要的概念,那麼這是否意味着團隊也可以成爲自己的聚合根? evans 指出,當你刪除一個聚合根目錄時,它的所有內部目錄也會被刪除, 所以這會讓一個團隊沒有父母聯盟。

如果有人能夠點亮我將非常感激。

感謝

回答

1

你問過非常相似question至少threetimes。該領域總是相同的:運動隊,聯賽和球員,但你提供的細節總是不同的,這就是你得到和接受不同答案的原因。你明顯處於分析癱瘓狀態。你第一次想出完美的模型的可能性很小。開始編寫代碼和測試,你會得到即時的反饋。尋找代碼的氣味,重構和更好的模型會出現。

關於這個問題的版本。骨料definition

被視爲一個單元,用於數據更改的 目的相關聯的對象的集羣。外部引用僅限於一個指定爲根的Aggregate的成員 。在集合的邊界內應用一組一致性規則 。

而經典的例子是Order as Aggregate root and Order Lines as Entities,它是Order Aggregate的一部分。請注意,訂單行在訂單之外沒有意義。

在你的情況下,「團隊不能沒有聯盟」的規則是不同的。宣佈團隊成爲聯盟總計的一部分是不夠的。它類似於「沒有客戶就沒有訂單」。這並不意味着客戶是訂單總計的一部分。客戶是它自己的總結,它是有意義的。就像團隊自己有意義,它有自己的歷史,球迷等。

這個問題也可以從「數據交換」的角度來處理。在埃文的例子中,整個秩序被鎖定,這樣內部的不變量就可以被執行。如果您對聯盟進行更改,您是否也希望所有球隊和球員都被鎖定?

因此,根據您此次提供的信息,您需要兩個聚合:聯盟和團隊。請記住,聚合可以相互引用。

+0

謝謝你,我會接受你的建議,並開始編碼和測試!它越多,我讀得越多,我感到困惑。例如,現在我已經閱讀了類方法中的命令行應該是一個值對象!這只是讓我失望了。 – Marco