Asp.net mvc 映射M->;MVC中的虚拟机?

Asp.net mvc 映射M->;MVC中的虚拟机?,asp.net-mvc,model-view-controller,Asp.net Mvc,Model View Controller,我使用ASP.NETMVC3 我在服务器端遇到了至少两种映射模型->视图模型的方法: 内部ViewModel类构造函数 控制器内部或指定的映射器类 我最喜欢第一种方法,因为ViewModel属性声明及其映射位于同一位置,易于维护和单元测试。有人能详细说明更多的利弊,或其他更好的做法吗 ViewModels可以独立于任何源于数据库的模型类而存在 我不建议将ViewModel填充代码放在控制器中,因为这不是控制器的责任(也是维护的噩梦) 我的观点是,从ViewModel到DBModel的映射(反

我使用ASP.NETMVC3

我在服务器端遇到了至少两种映射模型->视图模型的方法:

  • 内部ViewModel类构造函数
  • 控制器内部或指定的映射器类

我最喜欢第一种方法,因为ViewModel属性声明及其映射位于同一位置,易于维护和单元测试。有人能详细说明更多的利弊,或其他更好的做法吗

ViewModels可以独立于任何源于数据库的模型类而存在

我不建议将ViewModel填充代码放在控制器中,因为这不是控制器的责任(也是维护的噩梦)

我的观点是,从ViewModel到DBModel的映射(反之亦然)是ViewModel的责任,因此我的所有ViewModel类都实现了两个成员:

public static TViewModel FromDBModel(TDBModel dbModel);

public void ToDBModel(TDBModel dbModel);
第一个是控制器在返回视图时调用的静态方法。静态方法构造ViewModel的实例并相应地设置其成员

实例ToDBModel方法被传递一个构造的DBModel实例(在检索或更新数据时由存储库构造,或者在插入新数据时由控制器构造)


编辑:请注意,许多人对AutoMapper(它使用反射和其他技巧来自动化DBModelViewModel映射过程)之类的库深信不疑。我不喜欢自动映射,因为它剥夺了开发人员的控制权,当我必须学习映射程序如何工作以及如何让它映射非琐碎操作时,我看不到它为我赢得时间。YMMV.

我倾向于将实体和视图模型分开,以便它们彼此不知道。这是为了在测试控制器和映射本身时改进封装并最小化依赖性。看

相反,我会自己编写类来执行映射(如果很简单的话),或者使用AutoMapper并在控制器中使用该方法。对于具有数十个或数百个数据库实体和视图的大型系统,我倾向于使用AutoMapper。自己编写映射可能会变得非常乏味且容易出错。您必须平衡您自己编写它的价值与这种实现给业务带来的价值。毕竟,如果我们想了解每个框架的一切,我们每个人都应该编写自己的.NET框架版本。:)

也就是说,对于某些系统来说,使用视图模型可能没有什么好处,尤其是那些在视图中的“字段”和数据库实体之间存在一对一映射的系统。当我看到这一点时,我通常会畏缩,但考虑到系统的时间范围和复杂性,这始终是一种选择


还有一种情况是使用ASP.NETMVC公开API。在本例中,实体的“application/json”和“text/xml”表示形式只是“视图”。视图模型通常用于过滤外部表示中敏感和不必要的数据。在这种情况下,由于同一实体可能有多个表示(及其版本),映射变得相当复杂。然而,这似乎超出了OP.

有趣的方法。谢谢我也同意AutoMapper,如果您只有数百个属性,或者希望在运行时动态使用不同种类的映射,那么它似乎是有意义的。