2010-10-01 40 views
18

域與應用服務的主要區別是什麼? (我正在使用NHibernate)域服務與應用服務

哪一層更適合業務邏輯?什麼是最佳做法?

-S#架構使用應用程序服務作爲「協調層」,但不打算解釋爲什麼它不是域服務,哪裏應該是業務邏輯。

+2

http://stackoverflow.com/questions/2268699/domain-driven-design-domain-service-application-service – Karsten 2011-10-05 12:22:30

回答

23

您的里程可能會很長,但我會嘗試根據我的使用方式進行定義。不管你的持久層的,我會定義他們的實際應用:

  • 域服務 - 它存在於執行域的完整性,有利於插入,創建,刪除服務,和檢索數據來自域名。此外,域服務可以將域對象的更高級別的組合編排到視圖模型中。通常,這些是存儲庫之上的外觀,它們隱藏了一些低級實現,並提供更符合UL(無處不在的語言)的接口來幫助管理期望值。

  • 應用服務 - 特定於域模型實現或不依賴域模型的服務。這方面的一個典型例子是根據域中的狀態更改或操作發送和發送電子郵件。這通常是應用程序本身的一項要求,很可能不是由域模型指定的。這可以在調用域服務之後由應用程序服務程序執行,也可以作爲域服務引發的事件執行。

就像我說的,這可能不適合每個人的定義,但這有助於確保正確的關注點進入正確的位置。

至於在哪裏放置商業邏輯更好 - 我其實覺得這很棘手。採用這種風格的方法有多種類型的業務邏輯。如果存在無法在域中定義的特定於應用程序的邏輯要求,我會將其放入應用程序服務層。直接影響域的東西,不管應用程序如何,我都會放入域服務層。

問題確實花時間來確定什麼是真正的「領域問題」。例如,用戶可能無法發佈對某些任意應用程序的評論,除非他的電子郵件地址是已知的。你可以爭辯說這屬於任何一層。關鍵是真正的一致。

+0

「此外,域服務可以編排域對象的更高級別組合到視圖模型中」 - 不會那在應用程序服務中更合適? – BornToCode 2016-03-28 14:44:52

1
  • 域服務是由多個需要重用的類組成的域內的服務。

    • 應用程序服務是util類,其中技術人員完成,如壓縮或短信息。

請把你的邏輯放到域對象不進服務。在複雜的領域更好的重用。

2

我認爲@Karsten在他的評論中引用的帖子比@ joseph.ferris在這裏發佈的最有回報的答案更真實。

域名服務是用於「域名中的重要流程或轉型,而不是實體或價值對象的自然責任」(Eric Evans Domain-Driven Design)。

應用服務只是一些不大不小的門面或爲您的應用程序(或其他外部客戶)的API,他們通常對應於的使用情況的應用程序,並通過所需要的一組應用操作連接客戶層。他們不會包含業務邏輯,或者領域專家有一天可能會要求更改的任何內容。它們可能包含交易管理(工作單元),應用驗證(驗證從數據庫/輸入保存到數據庫中檢索對象的狀態),安全性驗證和橫切關注諸如記錄,緩存等和協調域對象到的ViewModels。當你有多個客戶端(例如網絡API和MVC)和用例反應涉及多個事務性資源(請參閱「服務層」由Martin Fowler在企業應用架構模式一節),他們是特別有用。

應用服務可以包含到庫中的調用來獲取數據填充域對象,那麼他們可能會調用域對象上或一些方法的域名服務,並再次調用庫堅持修改的域對象。它們通常來自域服務的「更廣泛」,因爲它們包含整個用例。