2011-03-07 126 views
6

我一直在努力將域驅動設計模式應用到我們的Web應用程序。我們遇到的一個問題是避免在實體內部使用存儲庫。域驅動設計模式 - 從域訪問存儲庫

例如,我們有一些實體的方法會觸發電子郵件。因此,我們必須有權訪問電子郵件模板(存儲在數據庫中),並在數據庫隊列表中創建新的電子郵件記錄。我們目前通過訪問這些實例中的存儲庫來違反該模式。

我們應該在這些情況下使用「服務」還是「應用程序」層(我們有很多)?有沒有更好的方法來解決這個問題?

回答

5

是的,我會建議創建一個服務來執行發送電子郵件。您可以創建一個用於與域模型在同一項目中與服務進行交互的接口,但是可以在單獨的項目中提供服務的實現,以便從模型到服務之間不存在硬性依賴關係。依賴關係顛倒了 - 從服務到模型。這也爲實現單元測試創​​建了一個更好的設置,以確保您的服務在應該被調用的環境下調用,因爲您現在可以在單元測試中模擬服務。

剩下要做的一件事就是確保在任何時候創建這些對象類型時都會注入您的服務。所以,你會將對象創建延遲到存儲庫。或者甚至更好,使用依賴注入框架來解決你的依賴。

+1

使用服務是一種好方法。關於注入服務:最好是通過將服務傳遞給*方法*而不是*構造函數*來使用雙重調度方法。這揭示了哪些方法依賴於服務,並允許您爲每種方法使用不同的服務實現。 – 2011-03-12 22:45:05

3

域名應該是持久性的無知。你不應該從內部與「倉庫」交談。

在您的方案中 - I would raise domain event(例如「客戶正在購買東西」)並處理從外部發送的電子郵件。

+3

「域名應該是持久性無知的。」 - 對。 「你不應該從內部與儲存庫交談。」 - 假。您應該訪問應該在外部實現的存儲庫的界面。 – dariol 2013-07-06 09:42:15