2012-02-20 58 views
2

聚合根可以有也是聚合根的兒童嗎?如果是,它只引用它,還是保持其他聚合根的屬性的聚合根具有通過該方法更改它的方法?將聚合根作爲屬性?

假設您有一個名爲「Worker」的類和另一個名爲「Company」的類。兩者都是聚合根源。公司擁有工人的財產。 對不起,讓一個壞榜樣

public class Company { 
    private Worker worker; 

    ... 

    public Worker getWorker() { 
     ... 
    } 
} 


public class Worker { 
    ... 
} 

或公司是否級「隱藏」工人?

public class Company { 
    private Worker worker; 

    ... 

    public String getWorkerName() { 
     ... 
    } 
} 


public class Worker { 
    ... 
} 

並且員工是否只會談論公司類,因爲它不是公司環境的一部分?爲什麼這樣?是否像我的第一個例子那樣總是訪問其他聚合根中包含的聚合根? (我會這麼認爲,但我沒有理由)

回答

1

總之,沒有。

這是有點兒很難在一個SO回答簡明扼要地解釋,但這裏的幾個要點,可以幫助您的理解:

  • 的聚合根是一致的邊界。基本上,需要保持一致的所有數據都屬於聚合根目錄。當它具有很高的凝聚力時,你會知道它的結構正確 - 大多數方法都會觸及很多私有屬性。
  • 所有與聚合根或其子代的交互應通過聚合根上的公共方法完成。在你的例子中,如果員工屬於公司,那麼添加/刪除員工或對員工執行任何操作應該通過公司的公共方法完成。
  • 可以有聚合根下的實體,但根據我的經驗,這往往是一種設計氣味。大多數情況下,根據我的經驗,您有價值對象作爲聚合的孩子。
  • 聚合根之間的關聯是通過ID完成的,因此公司可能知道一個名爲WorkerId的GUID,但它絕對不應該耦合到Worker類。 (這將允許您更輕鬆地進行重構。)
  • 如果操作(即方法)取決於數據的以前狀態,則只需要一個域模型(並因此聚合根)。如果不涉及狀態變化,只需執行CRUD。
+0

但是這個例子中的worker是否也可以在其他聚合根內?因爲它本身就是一個聚合根? – LuckyLuke 2012-02-21 17:38:47

+0

當你說在聚合根下沒有實體時,你的意思是這些對象不應該像實體一樣映射到數據庫中的表? – LuckyLuke 2012-02-21 17:40:12

+0

我不明白最後一部分。 – LuckyLuke 2012-02-21 17:41:05