2013-04-06 103 views
3

我是相當新的領域驅動設計(DDD),但我明白這是你的應用服務,這是進入你的「模型」說話。該服務可以與使用源(文件,數據庫等)來獲取數據的存儲庫通信。該存儲庫返回一個實體。領域驅動設計,實體延遲加載

這是我所瞭解的全球概念。服務知道倉庫,但不是實體等

現在我有以下問題。

我有一個實體的用戶,這是類似如下(只是一個例子)

<?php  
class User 
{ 
    protected $name; 
    protected $city_id; 

    public function getCity() 
    { 
     // return $city_entity; 
    } 
} 

的getCity()函數返回的城市實體。我希望這個函數使用延遲加載,因此在使用用戶存儲庫時注入CityEntity並不是真正的延遲加載。

我帶着兩個解決方案來解決這個問題。但我覺得這兩者都是反對DDD校長的。

我想出了第一種方法是在用戶的實體,它有缺點注入城市庫:如果你需要更多的庫,你需要加載它們都在實體。它看起來像answer,但它看起來像是我的存儲庫的包裝。那麼爲什麼不直接注入存儲庫呢?

第二種解決方案是,您爲該實體提供服務定位器。這樣做的缺點是除非您閱讀代碼,否則您不知道需要哪些存儲庫。

所以,現在的問題是,什麼是給懶加載的靈活性,同時保持DDD校長完好的最佳方法?

回答

13

一個在DDD主要的一點就是你的域模型應該只表達界上下文來處理業務規則的通用語言。

因此,在DDD實體中,延遲加載是一種反模式。有一些原因:

  1. 如果一個聚集僅持有它需要保證業務不變量數據,需要所有這些,他們都很少,因此eager loading更好地工作。
  2. 如果你懶加載數據,客戶端必須處理這些relevant in business terms
  3. 可以使用shared identifiers應付骨料之間的引用更出色的路徑
  4. 它的廉價用於投影目的(通常稱爲read-model專用查詢)

恕我直言,你永遠不應該使用DDD實體作爲數據訪問技術:使用DTOs。

如需進一步信息,你可以看看Effective Aggregate Design由沃恩弗農。