2011-05-31 117 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