域驅動設計
回答
這個問題提出使用單詞「層」,所以我最初的答案解決層。開始說DDD不是關於剛性層可能更好,它是關於以易於測試和更改的方式構建應用程序,因爲它鼓勵將不同對象之間的關注點分離。
我不喜歡將域稱爲「圖層」,因爲域對象並不是真正形成了一層意義上的圖層,而是在圖層之間傳遞,但不屬於任何圖層。就表現層訪問基礎設施而言,該圖表示這是一種選擇。從演示文稿中提取對基礎架構的訪問權限取決於您。在大多數情況下,我傾向於通過應用程序層來避免將其與實現細節掛鉤,但直接方法是一種選擇,這個決定取決於您。
由於缺乏具體的例子,我認爲閱讀埃文斯的書有點令人沮喪,但他試圖使其廣泛適用,而且一些語言比其他語言更靈活,因此他們可以以不同的方式做事。例如,當使用Java和Hibernate時,我沒有從域到數據訪問對象的任何引用,我想Hibernate持久集合實現像存儲庫一樣用於允許域模型的惰性遍歷。但這是基於我選擇的語言和圖書館的實施決策,其他情況可能證明不同的決定。
嗯,恕我直言,DDD不是關於'分層'。 這更多的是關於建模你正在努力解決的問題,以便你的模型(實體,價值對象,存儲庫,服務,規範)反映現實世界的問題領域。
但是,在你寫的類之間確實存在某種「分離」,但我真的不會去稱它爲「分層」,因爲恕我直言,你的表示類和域類完全可以例如訪問基礎設施。 但是,例如,域類不應該依賴於表示類,但相反的情況可能是正確的。
我主要是組織我的項目是這樣的:
- 一個有一個包含演示相關的東西組裝。 (表格等)
- 我有一個包含'域'的程序集。這包括實體,存儲庫,接口,規範類等等。
- 另一個包含存儲庫實現的程序集。
- 一組基礎設施組件:
- 一般的「框架」 DLL包含我可以在我的演示文稿中使用utils的,在我的領域類,等...
- 其中包含助手爲DB一個dll訪問(在我的情況下,NHibernate的一個薄包裝)。
在相反的是內森·休斯說,我認爲這是完全OK,你的表現層訪問的基礎設施,我有時會忽略的「應用服務層」。在這種情況下,我的表示層就是我的應用程序。 我也使用NHibernate,對我來說,我的表示層可以訪問NHibernate助手。因爲,我的應用程序(在某些情況下是我的表示層)是唯一具有應用程序上下文知識的「事物」。所以這是誰負責啓動和提交交易的人。
(正如埃文斯所說 - 在第5章中我認爲:語境是國王)。
我以前曾經在你提到的陳述中加入過,但放棄它,我同意不應該強加一個教條式分層方案。 – 2009-12-15 19:45:51
我們是否說DDD的重點是域接受還有其他問題,例如基礎設施等,並沒有嚴格的分層。如果需要的話,任何上層都可以使用任何較低層而不需要通過任何中介。 – David 2009-12-15 19:51:06
我認爲DDD的重點在於關注問題的分離,領域邏輯位於領域對象中,以及儘可能簡單地對系統進行更改,以瞭解企業真正需要的內容。您可以使用分層方案來提供幫助,但沒有嚴格的要求。 – 2009-12-15 20:09:43
- 1. 實施域驅動設計
- 2. 域驅動設計服務
- 3. 域驅動設計isDirty,isNew
- 4. 域驅動設計聚合
- 5. 域驅動設計問題
- 6. Django和域驅動設計
- 7. 域驅動設計映射
- 8. 域名驅動設計
- 9. 域驅動設計驗證
- 10. 濫用域驅動設計
- 11. 域驅動設計聚合根設計
- 12. 領域驅動設計 - 設計決策
- 13. 域驅動設計和域事件
- 14. 域驅動設計中的服務
- 15. 域驅動設計中的存儲庫
- 16. 訪問控制領域驅動設計
- 17. 域驅動設計(DDD)陷阱
- 18. .NET域驅動設計和CSLA.NET
- 19. 域驅動設計的缺點?
- 20. 使用域驅動設計的node.js
- 21. 域驅動設計和聚合
- 22. 域名驅動的設計和安全
- 23. 將mvc應用於域驅動設計
- 24. IoC容器和域驅動設計
- 25. 域驅動設計和文件存儲
- 26. 領域驅動設計方法彙總
- 27. 域驅動設計建模查詢
- 28. 域驅動設計和聚合引用
- 29. 狀態模式和域驅動設計
- 30. 使用領域驅動設計原則
這是我的想法,我沒有看到域對象作爲一個圖層或更多的其他圖層引用的域對象/服務的圖層,我不會期望看到演示使用數據訪問層等等。就像p68上的埃文斯圖似乎表明,對於哪些圖層可以訪問其他圖層,實際上是一種非常鬆散的方法。 – David 2009-12-15 19:30:51
埃文斯似乎希望鼓勵設計師儘可能地提高靈活性。 – 2009-12-15 19:40:26
我認爲將域圖層視爲一個單獨的圖層的邏輯是,它鼓勵您將域邏輯放在那裏,而不是在表示層或應用層中,反之亦然。 – 2009-12-15 19:59:41