7

我一直在研究洋蔥建築幾天。我明白,依賴關係應該總是朝向中心,以及如何使用依賴注入來實現這一點。但我有幾個問題,我仍然無法弄清楚。如何在洋蔥建築上實現服務和存儲庫?

  1. 模型(或實體)可以引用存儲庫接口或服務接口嗎?

    例如:一個Order實體具有通過Oder.DeliveryZip屬性,它是外鍵建立一個DeliveryCity關係,但都是獨一無二的。要獲得市拉鍊,我必須調用ICityRepository.FindByZip(zip)

    我在我的模型下面的代碼

    class Order 
    { 
        . . . 
    
        [Inject] 
        public ICityRepository CityRepository { get; set; } 
    
        private City _dCity; 
    
        public City DeliveryCity { 
         get { 
          if (_dCity == null) 
           _dCity = this.CityRepository.FindByZip(this.DeliveryZip); 
    
          return _dCity; 
         } 
        } 
        . . . 
    } 
    
  2. 什麼是上面的代碼的問題?它應該使用域名服務嗎?

  3. 域服務實現應該在覈心還是在基礎設施層定義?

回答

5

這是工廠適合的領域。 OrderFactory可以採用依賴性,例如對IOrderRepository的依賴以及對ICityRepository的依賴。當工廠用於創建(或重組)訂單實體時,工廠可以查找城市並相應地設置訂單屬性。或者,正如herzmeister所建議的那樣,使用Lazy進行設置,以便僅在需要時執行查找。

+0

它非常有意義!我在問自己「我怎麼會想念那個?」!謝謝! – svallory

+1

這是一個錯誤。 DDD工廠不負責重組。重組是物體的中間生命,工廠只關心生命的開始。請參閱此答案:http://stackoverflow.com/a/10264669/625332 – Dmitry

+0

我不同意。工廠用於創建對象的實例。它們可以處於對象生命週期的開始階段或用於重構。他們可能是兩個方法或兩個不同類的同一個類。無論哪種方式,我都同意在每種情況下工廠的行爲方式都有所不同。我通常將重組工廠作爲存儲庫的依賴關係,委託工廠創建並使用從數據存儲檢索的數據重新構建新實例。欲瞭解更多信息,請參閱埃文斯第145頁:「重建存儲的對象」 – SonOfPirate

5

上面的代碼會出現什麼問題?它應該使用域名服務嗎?

兩件事情在這裏考慮:

  1. ICityRepository不是訂單一個真正的依賴,換句話說順序並不需要它的其他方法。真正的依賴是對象不能沒有的東西。因此,您可能需要考慮將其作爲參數傳遞給方法,如'GetDeliveryCity'(有關詳細信息,請參閱this)。

  2. 通過郵政編碼查找城市似乎不是訂單的責任。對於訂單爲cohesive,它只能處理與訂單相關的功能。您可能想要將該功能從訂單類中取出。

需要將域名服務實現核心內部或在基礎架構層來定義?

內核如果這是真正的域服務(不是應用程序服務)。

0
  1. 如何

    private Lazy<City> _dCityLazy; 
    
    public City DeliveryCity { 
        get { 
         return _dCityLazy.Value; 
        } 
    } 
    

    在那裏你會注入Lazy<City>通過某種機制?

  2. 在這個例子中,你可以通過注射從外部靈活地決定。

  3. 我想說這實際上取決於特定域名服務的用途以及用途。

+0

通過IoC注入城市將導致向依賴注入器添加業務規則,這非常糟糕。我不確定這是你所建議的。 – svallory

+0

當然,依賴注入器中的業務規則非常糟糕,但並不一定如此。還有很多其他的可能性。兩者之間可以有一個域服務。或者,簡單的ID查找顯然是一個存儲庫的工作,它提供了從「Lazy 」的代表將被引用的實際方法。一般來說,我只想簡化我的實體,即不需要任何實際持久性結構的知識,即沒有任何對服務或存儲庫的引用。 – herzmeister