2014-10-31 37 views
1

迄今爲止我所讀到的關於DDD的一切都意味着只有封裝其他實體的實體纔是根集合。DDD:所有聚合根需要孩子嗎?

怎麼樣在這樣的情況:

WorkOrder 
- idManufacturer 
- WONumber 
- Description 

Manufacturer 
- idSelf 
- Name 

工單的引用製造商,但不會是工單的孩子其他實體可能會引用工單,在這種情況下,我會考慮這兩個根實體,但廠家不一個聚合...

這是正確的嗎?

+0

什麼是你有界的上下文,並且用戶可以直接與製造商交互? – 2014-10-31 17:07:02

+0

也許[我的帖子](http://www.sapiensworks.com/blog/post/2014/10/31/DDD-Identifying-Bounded-Contexts-and-Aggregates-Entities-and-Value-Objects.aspx)將幫助您更好地瞭解如何識別聚集體和聚集體根(AR)。順便說一句AR與兒童的概念無關 – MikeSW 2014-11-01 16:06:58

回答

1

當有人告訴我沒有孩子的實體可以作爲聚合根源時,我曾經有過一個DDD的燈泡時刻。

特別是當有人說「堅持只有你的聚合根」。

在你的例子中,你的聚合根是WorkOrderManufacturer。您需要一個WorkOrder的存儲庫和一個Manufacturer的存儲庫。

1

實際上,您將只能使用值對象進行聚合。帶小孩的AR很少見。閱讀紅皮書(實施DDD Vaughn Vernon),描述了小聚合體的規則。

0

聚合根的工作是封裝和執行不變量。它可能由其他對象組成,但它們都通過AR進行交互。關於聚合記住的重要事情是,它應該獨立於您選擇的持久性機制。大部分聚合應該沒有依賴關係!

我可能會誤解,但它看起來像idManufacturer是一個外鍵。這將建議(並非總是如此)它不封裝。這讓我花了一段時間纔想到我的頭腦是一個聚合中的字段是私人的。這就提出瞭如何保存它的狀態以及如何讓數據放入UI的問題。有很多方法。我最喜歡的方法是使用事件採購和CQRS。然後我可以從我的聚合產生的事件中構建UI。我也可以堅持這些事件並用它們來重建我的聚合。

我已經進入了更多的博客深度,你可能想看看How to Build an Aggregate Root! 。在使用CQRS和事件源時,您可能會發現構建主詳細信息屏幕的帖子非常有用,可以找到here

我希望幫助。