Dot-Net

如何在洋蔥架構上實現服務和儲存庫?

  • January 14, 2016

這幾天我一直在研究洋蔥架構。我了解依賴項應該始終朝向中心,以及如何使用依賴項注入來實現這一點。但是我有幾個問題我仍然無法弄清楚。

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

eg:一個Order實體有一個DeliveryCity通過Oder.DeliveryZip屬性建立的關係,它不是外鍵,而是唯一的。為了得到城市的拉鍊,我必須打電話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;
       }
   }
   . . .
}
  1. 上面的程式碼會有什麼問題?它應該改用域服務嗎?
  2. 領域服務實現應該在核心層還是在基礎設施層定義?

這就是工廠適合該領域的地方。OrderFactory 可以接受依賴,例如對 IOrderRepository 的依賴以及對 ICityRepository 的依賴。當工廠用於創建(或重構)一個 Order 實體時,工廠可以查找 City 並相應地設置 Order 屬性。或者,正如 herzmeister 建議的那樣,使用 Lazy 進行設置,以便僅在需要時執行查找。

上面的程式碼會有什麼問題?它應該改用域服務嗎?

這裡需要考慮兩件事:

  1. ICityRepository不是 Order 的真正依賴項,換句話說,Order 的其他方法不需要它。真正的依賴是對像不能沒有的東西。因此,您可能需要考慮將其作為參數傳遞給類似 ’ GetDeliveryCity’ 的方法(有關詳細資訊,請參閱內容)。
  2. 按郵政編碼查找城市似乎不是訂單的責任。為了使 Order 具有凝聚力,它必須只處理與訂單相關的功能。您可能希望將此功能從訂單類中移除。

領域服務實現應該在核心層還是在基礎設施層定義?

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

引用自:https://stackoverflow.com/questions/10442433