与Model和ViewModel混淆

我正在学习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

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

谢谢你的任何建议。

使用ViewModels 简化视图。

例如,您可能拥有包含Products,Order,Customers等的深层对象图 – 并且特定View上需要来自每个对象的一些信息。

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

ViewModel还允许数据注释和validation之类的东西 – 这不属于您的模型,因为您的模型应该保持“特定于域”。

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

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

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

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

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

控制器动作示例

 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); // Return strongly-typed view. return View(model); } 

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

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

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

对于除最简单的应用程序之外的所有应用程序,我建议使用单独的ViewModel。