与Model vs ViewModel混淆

问题描述

| 我正在学习ASP.NET MVC,并下载了一些示例应用程序。 MusicStore等... 我来自拥有MVVM模式的wpf背景。 我注意到他们使用了模型和viewmodel的概念。 在MVVM中,您很清楚将视图绑定到viewmodel,从而将模型注入到viewmodel中。 在MVC中,您有一个控制器,但是我不确定并困惑所有这些如何联系在一起,因为我看不到将模型注入到viewmodel中 我有以下结构 MyCompany.Entities.dll(所有模型都在这里)EG产品 MyCompany.Dal.dll(所有存储库都在这里) MyCompany.Services.dll(由MyCompany.WebUI.Controller调用,称为MyCompany.Dal) MyCompany.WebUI.MyApp 我的公司 从一些示例中,我已经看到您的模型充当viewmodel。我正确吗? 让我们以一个控制器为例
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中是否有效? 标准是什么? 感谢您的任何建议。     

解决方法

        使用ViewModels简化视图。 例如,您可能具有包含产品,订单,客户等的深层对象图-并且在特定视图上需要这些对象中的每个对象提供一些信息。 ViewModel提供了一种将View所需的信息聚合到单个对象中的方法。 ViewModel还允许诸如数据注释和验证之类的东西-不属于您的模型,因为您的模型应保持“特定于域”。 但实际上,ViewModels只不过是域对象的简单包装。 使用AutoMapper之类的工具可以轻松地在ViewModel和域模型之间来回映射。 就我个人而言,我总是绑定到ViewModel中的ViewModel \,而不是域模型,即使它是单个对象也是如此。为什么?好吧,我想用UIHints,验证,数据注释来装饰ViewModel。就像您的域模型通过特定于域的规则和业务逻辑来丰富一样,您的ViewModels也应该使用特定于UI的逻辑来进行丰富。 如果您仅拥有一个以1-1表示您的域模型的对象,那么您将失去ViewModels的意义。 仅添加到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);
}
    ,        MVC和MVVM之间的区别在于MVC具有一组用于数据实体的类。在MVVM中,您有2个-一组用于绑定到视图,另一组用于管理数据持久性(例如,可以在单独的WCF服务中)。 MVVM的好处在于,绑定到视图的模型与UI相关,并且完全独立于持久性模型。 使用哪个?好吧,这取决于Views所需的数据结构映射到数据库结构的紧密程度。当相似时-可以将DAL中的DataEntities直接绑定到视图-这是经典的MVC模式。但是,使用单独的ViewModel可以获得很多好处,因为您可以使用DAL不应关注的特定于View的行为(例如,验证)来扩展这些类。 对于除最简单的应用程序以外的所有应用程序,我建议使用单独的ViewModel。