ViewModel Redundancy Clarification

时间:2013-05-22 09:42:09

标签: asp.net-mvc-2 viewmodel asp.net-mvc-viewmodel

我最近在阅读有关ViewModel及其优点的文章。我能够理解为什么需要它,但是我的问题是如果我有两个类用于同一个对象(即Person类),我不会使代码冗余吗?此外,由于您需要确保基类模型和视图模型具有相同数量的属性,因此不会使将来的更改变得有点困难吗?例如,假设我有一个名为Person的表,其中有

  1. ID
  2. 名称
  3. 颜色
  4. 我正在创建一个用于创建NHibernate映射的hbm。我有以下模型类

    public class Person {
    
     public int ID {get;set;}
     public string Name {get;set;}
     public string color {get;set;} }
    

    如果我是正确的,视图模型类应该看起来像

    public class PersonViewModel {
    
    [DisplayName("Full Name")]
    public string Name {get;set;}
    [DisplayName("Favourite Color")]
    public string color {get;set;}
    }
    

    首先,我有两个classess引用db中的同一个对象。即使一个类用于DB目的而另一个用于View目的,我们仍然有两个具有完全相同元数据的类。其次,如果我在db中引入一个新字段,我需要在三个位置添加它,Base Model类,View Model Class和HBM文件。

    如果我错了,请纠正我,这怎么可以称为代码优化或最佳实践。

1 个答案:

答案 0 :(得分:1)

这取决于您希望采用的方法,您可以直接将模型公开为视图模型的属性,以避免违反DRY原则。但是,这会违反Demeter法则,因此您必须平衡这一点,因为您的视图现在将与您的域模型更紧密地结合。

此外,在验证方面,如果直接公开模型,则需要注意,即使您未在视图中直接使用该属性,最终用户也可以设置任何公开的属性。您也更有可能在每个视图中具有不同的验证要求,在这种情况下,验证将是视图模型的关注点。

这就是为什么一般的最佳做法是不将您的域模型直接暴露给视图。您可以使用AutoMapper等框架来减少层之间的数据传输管道代码。