与Model和ViewModel混淆

时间:2011-05-31 09:24:14

标签: c# .net asp.net asp.net-mvc asp.net-mvc-3

我正在学习ASP.NET MVC并下载了几个示例应用程序。 MusicStore等...

我来自wpf背景,我们有MVVM模式。 我注意到他们使用了模型和ViewModel的概念。

在MVVM中很清楚,您将视图绑定到ViewModel,将模型注入viewModel。 在MVC中你有一个控制器,但我不确定和混淆所有联系在一起,因为我看不到注入ViewModel的模型

我有以下结构

  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
  6. 从一些例子中我看到你的模型充当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中是否有效? 标准是什么?

    感谢您的任何建议。

2 个答案:

答案 0 :(得分:35)

使用 ViewModels 简化视图。

例如,您可能拥有包含产品,订单,客户等的深层对象图 - 并且特定视图中需要来自每个对象的一些信息。

ViewModel提供了一种将View所需信息聚合到单个对象中的方法。

ViewModel还允许数据注释和验证等内容 - 这些内容不属于您的模型,因为您的模型应保持“特定于域”。

但实际上,ViewModel只不过是域对象的简单包装器。

使用AutoMapper等工具轻松地在ViewModel和域模型之间来回映射。

我个人始终绑定到View中的ViewModel,从不绑定到域模型,即使它是单个对象。为什么?我喜欢使用UIHints,验证,数据注释来装饰我的ViewModel。就像使用特定于域的规则和业务逻辑丰富您的域模型一样,您的ViewModel也应该使用特定于UI的逻辑进行丰富。

如果您只是一个具有1-1域代表模型的对象,那么您就错过了ViewModel的观点。

仅添加到ViewModels,仅此而已,特定视图所需的内容。

控制器操作示例

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);
}

答案 1 :(得分:2)

MVC和MVVM之间的区别在于MVC有一组用于数据实体的类。在MVVM中,您有2个用于绑定视图的集合,以及一个用于管理数据持久性的集合(例如,可以在单独的WCF服务中)。

MVVM的好处是绑定到视图的模型与UI相关,并且与持久性模型完全独立。

使用哪个?那么它取决于您的视图所需的数据结构与数据库结构的紧密程度。当它相似时 - 可以将DAL中的DataEntities直接绑定到您的视图 - 这是经典的MVC模式。但是,您可以使用单独的ViewModel获得更多,因为您可以使用您的DAL不应关注的View特定行为(例如,验证)扩展这些类。

除了最简单的应用程序外,我建议使用单独的ViewModel。