Asp.net-Mvc

MVC Web 應用程序的域驅動設計與數據庫驅動設計

  • May 25, 2012

我正在將舊版 Web 窗體應用程序擴展/轉換為全新的 MVC 應用程序。擴展既是技術方面的,也是業務案例方面的。遺留應用程序是一個完善的數據庫驅動設計 (DBDD)。因此,例如,如果您有不同類型的員工,如操作員、主管、商店管理員等,並且您需要添加新類型,您只需在幾個表中添加一些行,瞧,您的 UI 會自動添加所有內容/更新新類型的員工。然而,層的分離不是那麼好。

新項目有兩個主要目標

  • 可擴展性(針對目前和未來的管道要求)
  • 表現

我打算創建一個新項目,用域驅動設計 (DDD) 替換數據庫驅動設計 (DBDD),同時牢記可擴展性要求。然而,如果我將它與傳統 DBDD 應用程序的性能進行比較,從數據庫驅動設計轉向領域驅動設計似乎會對性能要求產生負面影響。在遺留應用程序中,任何來自 UI 的數據呼叫都將直接與數據庫互動,並且任何數據都將以 DataReader 或(在某些情況下)DataSet 的形式返回。

現在有了嚴格的 DDD,任何數據呼叫都將通過業務層和數據訪問層進行路由。這意味著每次呼叫都會初始化一個業務對象和一個數據訪問對象。單個 UI 頁面可能需要不同類型的數據,這是一個 Web 應用程序,每個頁面都可以由多個使用者請求。此外,一個 MVC Web 應用程序是無狀態的,每個請求都需要每次都初始化業務對象和數據訪問對象。因此,對於 MVC 無狀態應用程序而言,DBDD 似乎比 DDD 性能更可取。

或者在 DDD 中有一種方法可以同時實現 DDD 提供的可擴展性和 DBDD 提供的性能?

您是否考慮過某種形式的命令查詢分離,其中更新通過域模型但讀取來自 DataReaders?成熟的 DDD 並不總是合適的。

“現在有了嚴格的 DDD,任何數據呼叫都將通過業務層和數據訪問層進行路由。”

我不相信這是真的,當然也不實用。我相信這應該是:

現在有了嚴格的 DDD,任何對事務的呼叫都將通過業務層和數據訪問層進行路由。

沒有什麼說您不能直接呼叫數據訪問層來獲取您需要在螢幕上顯示的任何數據。只有當您需要修改數據時,您才需要呼叫基於其行為設計的域模型。在我看來,這是一個關鍵的區別。如果您通過域模型路由所有內容,您將遇到三個問題:

  1. 時間 - 實現功能會花費您更長的時間,但沒有任何好處。
  2. 模型設計——你的領域模型會變形,以滿足查詢而不是行為的需要。
  3. 性能 - 不是因為額外的層,而是因為您無法像直接從查詢中那樣快速地從模型中獲取聚合數據。即考慮為特定客戶下達的所有訂單的總價值——為此編寫查詢比獲取客戶的所有訂單實體、迭代和求和要快得多。

正如 Chriseyre2000 所提到的,CQRS 旨在解決這些確切的問題。

引用自:https://stackoverflow.com/questions/10684854