2014-02-24 100 views
1

我想了解'聚合根'的概念。數據庫和聚合根的存儲庫模式

令我困惑的事情之一是我不應該直接訪問子實體而不訪問其聚合根。例如,假設我有一個計算機實體和一個硬件實體。

據我瞭解,我不應該直接直接訪問硬件實體。我應該通過它的聚合根(這是一個計算機實體)訪問一個硬件實體。

比方說,我有一個控制器,使用存儲庫和查詢計算機實體。

class Controller_Test { 

    public function loadHardware($computerRepository) 
    { 
     $computer = $computerRepository->find_by_id(1); 
     $hardware = $computer->hardware; // lazy load 
    } 
} 

如果我正在使用數據庫,我將最終執行兩個查詢。一個用於計算機,另一個用於硬件。

在我的資源庫中保存「loadComputerWithHardware」以保存查詢號是否合理?它是否違反DDD規則(通過連接兩個表來查詢計算機和硬件)?

回答

4

沒有人強迫你使用延遲加載,當你有複雜的實體圖時這樣做很常見,但如果它更適合你,則可以使用急切加載。請注意,即使您使用延遲加載,也可以使域模型透明。

讓我困惑的事情之一是我不應該直接訪問子實體而不訪問它的聚合根。

那麼這個想法是,聚合是唯一負責其圖中的所有實體,所以在其圖中執行的所有操作都應該通過他,甚至查詢單個節點(子實體)。

在我的資源庫中保存「loadComputerWithHardware」以保存查詢號是否合理?

那麼,這取決於你,但如果你不小心,最終可能會混淆你的接口。我會堅持loadComputer,並讓每個數據存儲庫的實現決定何時更好地進行急切或延遲加載。

它是否違反DDD規則(通過連接兩個表查詢計算機和硬件)?

不,「連接兩個表」不是一個領域的概念,它是一個數據層的問題,它們應該被分離。

3

控制器不會知道任何有關硬件的信息。它只知道計算機。存儲庫負責加載計算機需要的所有內容。如果您需要從控制器的角度對硬件進行參考,那麼它可能有資格作爲一個聚合體本身。

+0

如果我想要一臺帶有一個查詢的硬件的計算機,該怎麼辦?正如我的問題所述,是否違反了'loadComputerWithHardware'或'findWithHardware'? – Moon

+1

如果硬件是聚合的一部分,那麼它應該由計算機的存儲庫檢索。 –