2011-08-26 82 views
3

我不會對我的Eric Evans' Domain-driven design book,但它說基本上領域驅動設計總引用問題

外部對象可能不會堅持就是 內部聚集的實體的引用。外部對象必須僅引用 聚合根,不包含內部對象。

例如,我的Team聚合根有一個稱爲AddPlayer()方法並返回Player實體加入。這是否意味着我違反了規則,還是說我不能從空氣中拉出一個實體,例如將其從其邊界外的存儲庫中拉出來?

回答

4

這總是一個棘手的問題,很可能表明您的設計不太適合您的域名。我有一點要說一下這個在我的博客(你應該關注):

http://www.ebenroux.co.za/post/2010/08/20/Natrual-Aggregates-vs-Synthetic-Aggregates.aspx

你有Team和你有一個Player。那將是2根總根。讓團隊成爲聚合根和玩家只是一個被包含的實體,這可能會導致你痛苦。在現實生活中,一名球員不需要屬於一支球隊,這也取決於你的球隊是什麼。它只是一個集體名稱,或者是現有的成員,或者是某一天可以帶到現場的實際人員?

所以,你最終可能會與不同的 '團隊':

  • GameSquad

讓球員不一定部分骨料但相反,聚合可以具有某種所有權,可能對玩家的引用很弱(例如只有一個ID或某個值對象)。對此有所影響。

但要回什麼埃裏克指的是在他的書:我認爲這涉及到這樣的事情(使用模具):

VAR線= Order.AddLine(SomeProduct);

這裏應該沒有太大的意義在集合內引用實際實體,因爲它沒有它自己的生命週期。那麼,在這種情況下,訂單行甚至不是一個實體。

關於是否只有存儲庫返回AR或實體(在某些存儲庫中是AR),也有一些討論。根據什麼已經找到了藍皮書你可以從存儲庫中檢索一個實體。

無論如何。只是一些想法。 HTH :)

+0

事實上,這是一個高爾夫郊遊,所以我真正的實體是一個四人組和玩家,玩家不存在沒有其父母四人組。這有幫助嗎? – Marco

+0

因此,我們可以說我需要從應用程序層對每個玩家做些什麼,該命令返回給我的玩家集合是什麼? – Marco

+0

'訂單'是來自訂單處理有界上下文的示例。至於高爾夫:我仍然會有一名球員。該玩家可能參與許多「錦標賽」和許多「四人組」。例如,您可以在球員管理BC中擁有一名「球員」,並在錦標賽BC中擁有一名「球員」,您可以將球員添加到四人組中。或者你可以爲'Foursome'設置一個'AssignedPlayer'。但這一切都取決於你的域名。 –

0

我認爲你正在讀Eric Evans的指導。我不認爲他在說你不能讓球員接觸球隊。相反,我讀了像Eben這樣的規則。如果玩家在團隊背景之外沒有任何意義,那麼你不希望傳遞玩家,特別是如果「外部對象」與團隊沒有概念或關係。自從我看了那本書以來,這已經很長時間了。你確定這不適用於系統集成邊界嗎?我無法想象埃裏克在說你不能在你的系統中傳遞玩家。