Dot-Net
如何在洋蔥架構上實現服務和儲存庫?
這幾天我一直在研究洋蔥架構。我了解依賴項應該始終朝向中心,以及如何使用依賴項注入來實現這一點。但是我有幾個問題我仍然無法弄清楚。
- 模型(或實體)可以引用儲存庫介面或服務介面嗎?
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; } } . . . }
- 上面的程式碼會有什麼問題?它應該改用域服務嗎?
- 領域服務實現應該在核心層還是在基礎設施層定義?
這就是工廠適合該領域的地方。OrderFactory 可以接受依賴,例如對 IOrderRepository 的依賴以及對 ICityRepository 的依賴。當工廠用於創建(或重構)一個 Order 實體時,工廠可以查找 City 並相應地設置 Order 屬性。或者,正如 herzmeister 建議的那樣,使用 Lazy 進行設置,以便僅在需要時執行查找。
上面的程式碼會有什麼問題?它應該改用域服務嗎?
這裡需要考慮兩件事:
ICityRepository不是 Order 的真正依賴項,換句話說,Order 的其他方法不需要它。真正的依賴是對像不能沒有的東西。因此,您可能需要考慮將其作為參數傳遞給類似 ’GetDeliveryCity’ 的方法(有關詳細資訊,請參閱此內容)。- 按郵政編碼查找城市似乎不是訂單的責任。為了使 Order 具有凝聚力,它必須只處理與訂單相關的功能。您可能希望將此功能從訂單類中移除。
領域服務實現應該在核心層還是在基礎設施層定義?
如果這是真正的域服務(不是應用程序服務),則在核心內部。