2009-12-15 151 views
4

DDD的分層方案表明層應該是;域驅動設計

演示/應用/域/基礎設施

在埃文斯書給出的圖示出了演示文稿訪問基礎結構層。我對這個圖的解釋是正確的,因爲任何上層都可以被允許訪問任何下層。

回答

3

這個問題提出使用單詞「層」,所以我最初的答案解決層。開始說DDD不是關於剛性層可能更好,它是關於以易於測試和更改的方式構建應用程序,因爲它鼓勵將不同對象之間的關注點分離。

我不喜歡將域稱爲「圖層」,因爲域對象並不是真正形成了一層意義上的圖層,而是在圖層之間傳遞,但不屬於任何圖層。就表現層訪問基礎設施而言,該圖表示這是一種選擇。從演示文稿中提取對基礎架構的訪問權限取決於您。在大多數情況下,我傾向於通過應用程序層來避免將其與實現細節掛鉤,但直接方法是一種選擇,這個決定取決於您。

由於缺乏具體的例子,我認爲閱讀埃文斯的書有點令人沮喪,但他試圖使其廣泛適用,而且一些語言比其他語言更靈活,因此他們可以以不同的方式做事。例如,當使用Java和Hibernate時,我沒有從域到數據訪問對象的任何引用,我想Hibernate持久集合實現像存儲庫一樣用於允許域模型的惰性遍歷。但這是基於我選擇的語言和圖書館的實施決策,其他情況可能證明不同的決定。

+0

這是我的想法,我沒有看到域對象作爲一個圖層或更多的其他圖層引用的域對象/服務的圖層,我不會期望看到演示使用數據訪問層等等。就像p68上的埃文斯圖似乎表明,對於哪些圖層可以訪問其他圖層,實際上是一種非常鬆散的方法。 – David 2009-12-15 19:30:51

+0

埃文斯似乎希望鼓勵設計師儘可能地提高靈活性。 – 2009-12-15 19:40:26

+0

我認爲將域圖層視爲一個單獨的圖層的邏輯是,它鼓勵您將域邏輯放在那裏,而不是在表示層或應用層中,反之亦然。 – 2009-12-15 19:59:41

1

嗯,恕我直言,DDD不是關於'分層'。 這更多的是關於建模你正在努力解決的問題,以便你的模型(實體,價值對象,存儲庫,服務,規範)反映現實世界的問題領域。

但是,在你寫的類之間確實存在某種「分離」,但我真的不會去稱它爲「分層」,因爲恕我直言,你的表示類和域類完全可以例如訪問基礎設施。 但是,例如,域類不應該依賴於表示類,但相反的情況可能是正確的。

我主要是組織我的項目是這樣的:

  • 一個有一個包含演示相關的東西組裝。 (表格等)
  • 我有一個包含'域'的程序集。這包括實體,存儲庫,接口,規範類等等。
  • 另一個包含存儲庫實現的程序集。
  • 一組基礎設施組件:
    • 一般的「框架」 DLL包含我可以在我的演示文稿中使用utils的,在我的領域類,等...
    • 其中包含助手爲DB一個dll訪問(在我的情況下,NHibernate的一個薄包裝)。

在相反的是內森·休斯說,我認爲這是完全OK,你的表現層訪問的基礎設施,我有時會忽略的「應用服務層」。在這種情況下,我的表示層就是我的應用程序。 我也使用NHibernate,對我來說,我的表示層可以訪問NHibernate助手。因爲,我的應用程序(在某些情況下是我的表示層)是唯一具有應用程序上下文知識的「事物」。所以這是誰負責啓動和提交交易的人。

(正如埃文斯所說 - 在第5章中我認爲:語境是國王)。

+0

我以前曾經在你提到的陳述中加入過,但放棄它,我同意不應該強加一個教條式分層方案。 – 2009-12-15 19:45:51

+0

我們是否說DDD的重點是域接受還有其他問題,例如基礎設施等,並沒有嚴格的分層。如果需要的話,任何上層都可以使用任何較低層而不需要通過任何中介。 – David 2009-12-15 19:51:06

+1

我認爲DDD的重點在於關注問題的分離,領域邏輯位於領域對象中,以及儘可能簡單地對系統進行更改,以瞭解企業真正需要的內容。您可以使用分層方案來提供幫助,但沒有嚴格的要求。 – 2009-12-15 20:09:43