将一个实体映射到一个视图模型或许多视图模型

时间:2012-08-28 22:10:23

标签: asp.net-mvc mapping viewmodel

我有一个客户实体多个视图模型,具体取决于现有视图,如创建,更新,获取,删除。这些视图模型与实体共享相同的属性,最高可达75%。

我应该更好地将所有客户视图模型合并到一个大视图模型中吗?

所以我必须只映射并始终从一个实体映射到一个viewmodel并返回? 你觉得我现在还没想到某些场景的灵活性有任何不利之处吗?

3 个答案:

答案 0 :(得分:0)

从长远来看,将它们分开会更好,因为虽然每个ViewModel中包含的数据可能相似甚至相同,但意图却不同。例如,创建和更新ViewModel肯定是相似的,但有一些重要的区别。首先,创建视图模型通常没有实体的标识,并且由于它没有意义,因此可能存在混淆。其次,如果应用程序支持部分更新,则更新ViewModel可以是对现有实体的更改的集合,而不是整个实体。

如果您正在努力DRY,您可以通过共享整个ViewModel类以外的方式实现可重用性。相反,您可以创建较小的可重用组件,并通过组合而不是继承来重用。尝试强制单个ViewModel类来满足所有要求将是错误的,因为代码更难以推理。很多时候,简单的副本和粘贴比OOP提供的更好地完成工作。

答案 1 :(得分:0)

一方面,在您描述时拆分ViewModel会使您的代码库非常清晰,因为您可以确保每个ViewModel完全符合目的并且没有不必要的属性。另一方面,这意味着您需要维护更多代码 - 对实体的更改可能意味着对多个ViewModel的更改。

另一方面,一个大的ViewModel方法基本上完全相反的优点和缺点 - 维护的代码较少,但ViewModel不太适合用途。

这里没有正确或错误的答案,你已经过分重视每种方法的优点和缺点,并决定最适合你的方法。

一种中途方法是创建/更新一个ViewModel,一个用于Retrieve,一个用于Delete,因为Create / Update可能非常相似。

答案 2 :(得分:0)

另一个,大多数OO选项都在于良好的旧继承:定义一个类MyVM中的操作之间的通用功能,并根据您认为适合不同操作的方式对其进行扩展(继承它):MyVMEditMyVMDeleteMyVMCreate,“MyVMList”。

这是两全其美:你只维护一次,并扩展它们以适应每个视图。

这里没有正确的方法,因为它不是数学,你采取任何完成工作的方法都会完成工作:)但是...... 有时我们离开了我们的根太远 :)它纯粹的旧的面向对象的方法。

如果继承(或扩展)出现任何问题(由于任何原因),您可以在每个MyVM模型中嵌入MyVM<Action>部分,并实现相同级别的抽象/功能平衡。

像往常一样 - 正确工作的正确工具。

希望这会对你有所帮助。