2011-05-31 116 views
22

我正在學習ASP.NET MVC並下載了幾個示例應用程序。音樂商店等...與模型混淆vs ViewModel

我來自我們有MVVM模式的wpf背景。 我注意到他們使用了model和ViewModel的概念。

在MVVM中,非常清楚您將視圖綁定到將模型注入到ViewModel的ViewModel。 在MVC你有一個控制器,但我不知道和困惑如何一切聯繫在一起,因爲我看不到注入到視圖模型的模型

我有以下結構

  1. MyCompany.Entities.dll (所有型號放在這裏)EG產品
  2. MyCompany.Dal.dll(所有庫放在這裏)
  3. MyCompany.Services.dll(由MyCompany.WebUI.Controller稱爲調用MyCompany.Dal)
  4. MyCompany的。 WebUI.MyApp
  5. MyCompany.Tests

從一些我見過你的模型作爲一個ViewModel.Am我糾正的例子嗎?

讓我們來控制我有類似

public class ProductController 
{ 
    public ProductController(IProductRepository productRepository) 
    { 
     //omitted as not relevant 
    } 
} 
public class ProductVM 
{ 
    public ProductVM() 
    { 
     // Shouldn't we inject the model here RG Product 
    } 
} 

有一些N層的例子在那裏我可以參考? ViewModel的概念在MVC中是否有效? 標準是什麼?

感謝您的任何建議。

回答

32

使用ViewModels簡化的視圖。例如,您可能會在產品,訂單,客戶等方面擁有較深的對象圖,並且在特定的視圖中需要來自這些對象的某些信息。

ViewModel提供了一種將View所需的信息彙總到單個對象中的方法。

ViewModel還支持諸如數據註釋和驗證之類的東西 - 這些不屬於您的模型,因爲您的模型應該保持「特定於域」的狀態。

但實際上,ViewModels只不過是您的域對象的簡單包裝。

使用像AutoMapper這樣的工具輕鬆地在ViewModels和域模型之間來回映射。

個人我總是綁定ViewModel在我的視圖的,從來沒有域模型,即使它是一個單一的對象。爲什麼?那麼我喜歡用UIHints,驗證,數據註釋來裝飾我的ViewModels。就像您的域模型使用特定於域的規則和業務邏輯進行豐富一樣,您的ViewModel應該使用特定於UI的邏輯進行豐富。

如果您只是擁有一個帶有您的域模型的1-1表示的對象,那麼您就錯過了ViewModels的要點。

僅添加到ViewModels,僅此而已,特定View所需的內容。

實施例的控制器操作

public ActionResult CustomerInfo(int customerId) 
{ 
    // Fetch the customer from the Repository. 
    var customer = _repository.FindById(customerId); 

    // Map domain to ViewModel. 
    var model = Mapper.Map<Customer,CustomerViewModel>(customer); 

    // Return strongly-typed view. 
    return View(model); 
} 
+2

您好,感謝您的回覆,您是否在說:我們的webApp中沒有模型。我們有控制器引用的ViewModels,然後我們將域「模型」注入到viewModel中,以便我們可以添加註釋和驗證我們的ViewModels.Do你有一個快速的例子或鏈接我們這是結構化?我會非常感謝。謝謝 – user9969 2011-05-31 09:35:46

+1

這**完全**即時通訊說 - 做得很好總結在一句話。當然,你的Web應用程序仍然需要**引用**域模型程序集,因爲它需要在它們之間來回映射。但踢球者是你的觀點不知道你的領域模型,他們綁定到ViewModels。體面的例子在這裏:http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx。只是谷歌周圍的「asp.net mvc查看模型模式」 – RPM1984 2011-05-31 09:39:29

+0

我還用AutoMapper添加了一個非常簡單的例子。 – RPM1984 2011-05-31 09:42:43

1

MVC和MVVM之間的區別是,MVC具有用於數據實體的一組類。在MVVM中,您有2套用於綁定視圖的功能,還有一套用於管理數據持久性(可能位於單獨的WCF服務中)。

MVVM的好處在於綁定到視圖的模型與UI相關並且與持久性模型完全無關。

要使用哪種?那麼它取決於視圖所需的數據結構與數據庫結構的緊密關係。當它相似時 - 可以將DAL中的DataEntities直接綁定到您的視圖 - 這是經典的MVC模式。但是,您可以通過單獨的ViewModel獲得很多收益,因爲您可以使用查看特定行爲(例如,驗證)來擴展這些類,DAL不應該關注這些行爲。

對於除最簡單的應用程序之外的所有應用程序,我建議使用獨立的ViewModel。

+0

你好,謝謝你的回覆。我的意見不知道數據庫。他們將調用一個「視圖模型」和那些服務層,並從那裏通過接口提供一個DAL.All。從你所說的MVVM實際上是MVC中使用的模式。這就是你說的嗎? – user9969 2011-05-31 09:38:02

+0

對不起 - 我的最後一個句子感到困惑 - 我不是說Views引用了數據庫 - 我會更新。我的意思是ViewModel所需的結構與數據庫中使用的結構相匹配的程度。但在回答你的問題 - 是的 - 在你的情況下,ViewModel將是我的選擇。 – BonyT 2011-05-31 09:46:38