Asp.net-Mvc

在哪裡將 DTO 轉換為 ViewModel?

  • August 8, 2012

我繼承了一個 MVC2 項目,使用了一個非常標準且保存完好的 DDD 模式。我也對整個 DTO/ViewModel 辯論進行了大量閱讀。

目前我們的 DTO 經常像ViewModels一樣使用。老實說,這對我們正在做的事情沒有影響,但我想在升級網站時使用正確的 ViewModel。

這是我的問題:

我們的“域”項目模型目前持有實體並將 DTO 返回給我的控制器。現在我需要將該 DTO 映射到 ViewModel。我應該在哪裡做這個?

  • 就在控制器裡?
  • 在域項目中?
  • 別處?

我將我的 ViewModel 與我們的“Web”項目中的視圖放在一起,因此在域項目中轉換*DTO -> ViewModel感覺不對。*在控制器中這樣做也感覺不對。

別人做了什麼?

編輯:

這個問題/答案建議在控制器中處理它。這肯定很容易過度思考。

DTO 通常是特定於技術的。例如,在 .NET 世界中,您的 DTO 可能帶有序列DataContractDataMember屬性。此外,DTO 與返回它們的服務一起形成了六邊形架構的域適配器。它們使您的域適應特定的傳輸技術,例如 HTTP,因此它們位於您的域之外。換句話說,域不應該了解 DTO - DTO 應該在單獨的項目中定義。包含該服務的項目應該具有將域對象映射到 DTO 的映射程式碼。

ASP.NET MVC 項目在本質上是相似的——它使您的服務/DTO(或直接域對象)適應一種表示技術,特別是 HTML。因此,DTO 不應該知道 ViewModel。相反,MVC 控制器應該呼叫 DTO 和 ViewModel 之間的映射。這可以通過多種方式完成,但我發現效果最好的是 ViewModel 中的建構子接受 DTO。此外,在控制器操作保證創建 DTO 以發送回服務的情況下,ViewModel 可以包含基於 ViewModel 創建 DTO 的方法。這包含 ViewModel 中最接近實際數據的所有映射程式碼 -資訊專家模式的一個實例。實現這一點的另一種方法是使用類似的東西AutoMapper使用基於約定的映射來避免樣板程式碼。除非有必要,否則我會認為除此之外的任何東西都是矯枉過正的。

在許多情況下,您的 ViewModel 最終看起來就像 DTO,但具有用於綁定和驗證的 ASP.NET MVC 特定屬性。儘管這似乎違反了DRY,但這些確實是單獨的職責。

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