2010-06-03 38 views
3

在DDD中,Repository負責保存和檢索域對象,並且還充當聚合根的集合。我的問題是,如何檢索基本規則爲Repository的Aggregate的子實體的信息(比方說來自數據庫)應僅保存Aggregate Roots(父對象)的集合而不是子對象?如何檢索聚合對象?

例如:

用戶(父對象) 訂單(子對象)

用戶域對象被存儲在用戶表和訂單被存儲在另一個表。

基本上,檢索域對象可能是這樣的:

<?php 
$userRepos = new UserRepository(); 
$user = $userRepos->find($userId); 
?> 

那麼如何子對象(訂單)用戶實體來檢索要爲用戶聚集的一部分?

+0

你們可以演示如何從DB與倉庫構建一個簡單的聚合? – Jebb 2010-06-03 09:51:18

回答

2

我相信,即使存儲庫僅保存對聚合根的引用,聚合根也將持有對其子對象(值對象)的引用。因此,生成Aggregate對象的工廠將在Aggregate Roots和Value對象之間構建這些「內部」引用,然後只有Aggregate Root需要放置在Repositories中。然後,一旦將聚合根從存儲庫中提取出來(通過簡單的getter API),就可以簡單地檢索這些子對象。

+1

存儲庫將解除或隔離域與持久性。從存儲/通過存儲庫(例如UserRepository)檢索單個域對象(例如用戶)是合理的,問題在於檢索一個Aggregate而不是一個Domain Object的情況,如何檢索那些形成Aggregate的子對象?通過存儲庫也?但是僅爲聚合根提供存儲庫而不爲聚合的子對象提供存儲庫。 – Jebb 2010-06-04 03:47:17

+0

是聚集存儲在repo類域對象中。在聚合的情況下,儘管它們具有內部對其子對象的引用。您不應該直接嘗試從回購中檢索聚合子代。在您的示例中,您有一個用戶聚合對象將訂單列表作爲孩子(與用戶關聯的訂單)。爲了做到這一點,您首先需要從repo中檢索用戶對象。然後,您可以在用戶對象本身上使用getter方法來檢索訂單子對象(因爲聚合根是唯一可以訪問子對象的對象) – 2010-06-04 12:27:40

+1

謝謝埃裏克。是的,我同意你的觀點,在Aggregate中獲取/交互的子對象(Orders)應該通過Aggregate Root(User)來完成,也許我的問題的上下文位於Repository本身內部,假設沒有ORM(例如Doctrine 2)在Repository中實現。 – Jebb 2010-06-07 01:59:31