2010-06-07 67 views
1

假設在倉庫中沒有使用ORM(例如Doctrine),我的問題是實例化聚合對象的正確方法是什麼?是直接在存儲庫中實例化子對象,並通過其設置者將其分配給聚合根,或者聚合根負責構造其子實體/對象?正確重構存儲庫中的聚合對象?

實施例1:

class UserRepository 
{ 
    // Create user domain entity. 
    $user = new User(); 
    $user->setName('Juan'); 

    // Create child object orders entity. 
    $orders = new Orders($orders); 
    $user->setOrders($orders); 
} 

實施例2:

class UserRepository 
{ 
    // Create user domain entity. 
    $user = new User(); 
    $user->setName('Juan'); 

    // Get orders. 
    $orders = $ordersDao->findByUser(1); 
    $user->setOrders($orders); 
} 

而實施例2中,訂單實例化的照顧該用戶實體的內部。

+0

我不太確定(不完全理解問題),但最後的評論說「訂單在用戶實體內部得到了關注」 - 我認爲你不想這樣做。實體不希望自己安頓下來。如果您必須從實體中委託這種責任類型,則應將其代理給域服務。 – 2011-02-11 02:09:22

回答

3

你絕對應該使用構造函數來創建對象,而不是使用setter。 DDD的重要原則之一是傳達意圖。如果名稱是創建用戶所必需的,那麼只要允許創建用戶實例(如果提供了名稱)就可以清楚地傳達該要求。這些被稱爲「不變式」,應該在創建對象之前始終滿足。這樣你就清楚地說「這是你在這個對象處於有效狀態之前需要提供的東西。」

重構對象時(例如在存儲庫中),您需要將子對象傳遞給構造函數。根據我的經驗,我的聚合有2個構造函數:一個用於創建(可能由工廠調用),另一個用於重構(通常由存儲庫調用)。