2012-07-16 68 views
0

我使用ASP.NET MVC 3.在MVC中映射M-> VM的最佳位置?

我遇到在服務器端用於映射模型 - >視圖模型至少2的方法:

  • ViewModel類構造函數中
  • 內部控制器或指定映射類

我最喜歡第一種方法,因爲ViewModel屬性聲明及其映射位於同一位置,易於維護和單元測試。任何人都可以指定更多的利弊或其他更好的做法嗎?

回答

2

ViewModels可以獨立於任何數據庫發起的模型類而存在。

我不建議把視圖模型人口代碼控制器內部,因爲這何嘗不是控制器的響應(同時也是一個維護的噩夢)。

我的看法是,映射從視圖模型來DbModel之後(反之亦然)是視圖模型的責任,所以我所有的ViewModel類實現兩個成員:

public static TViewModel FromDBModel(TDBModel dbModel); 

public void ToDBModel(TDBModel dbModel); 

首先是一個靜態方法控制器在返回視圖時調用。靜態方法構造ViewModel的一個實例並相應地設置它的成員。

實例ToDBModel方法傳遞一個構造實例DbModel之後(或者檢索或更新數據時,由所述存儲庫構成,或插入新的數據時,由所述控制器構造的)。

HTH。

編輯:請注意,許多人發誓的圖書館,如AutoMapper(它使用反射和其他技巧來自動化DBModel < - > ViewModel映射過程)。我不喜歡自動映射,因爲它遠離開發人員的控制權,我不知道它讓我花時間學習映射器的工作方式,以及如何將映射器映射到非平凡的操作。因人而異。

+0

有趣的方法。謝謝。我也同意AutoMapper,如果你只有數百個屬性,或者想在運行時動態使用不同類型的映射,這似乎是有意義的。 – YMC 2012-07-17 00:53:15

0

我會傾向於保持實體和視圖模型分開,使得他們不知道對方。這是爲了在測試控制器和映射本身時改進封裝並最小化依賴關係。見Separation of concerns

相反,我會寫的類來執行自己的映射(如果它的簡單),或使用AutoMapper和使用該方法從控制器內。對於具有數十或數百個數據庫實體和視圖的較大系統,我傾向於傾向於AutoMapper。自己編寫映射可能會變得非常乏味且容易出錯。你必須平衡你自己寫的價值與實施給企業帶來的價值。畢竟,如果我們想知道每個框架的所有內容,我們都會編寫我們自己的.NET框架版本。 :)

這就是說,有可能使用圖模型對於一些系統沒有什麼好處,特別是那些有一個一對一的映射在視圖中「田」和數據庫實體[又名典型CRUD]之間。當我看到這件事時,我通常會畏縮不前,但鑑於系統的時間框架和複雜性,它總是一種選擇。

然後有一個情況下,當您使用ASP.NET MVC暴露的API。在這種情況下,實體的「application/json」和「text/xml」表示只是「視圖」。視圖模型通常使用來自外部演示文稿的過濾器敏感和不必要的數據。在這種情況下,映射變得相當複雜,因爲對於同一個實體可能有幾個表示(及其版本)。但是,這似乎在OP之外。