【问题标题】:ViewModel Redundancy ClarificationViewModel 冗余说明
【发布时间】:2013-05-22 09:42:09
【问题描述】:

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

  1. 身份证
  2. 姓名
  3. 颜色

我正在创建一个用于为 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;}
}

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以你是说每个对象都做它应该做的最好的事情。基本模型类应该绑定到数据库。 View Model 绑定到基本模型类,但具有所有验证。 IDE 有没有办法提醒我 View Model 中新添加的属性在 Base Model 中不存在,反之亦然?
    • 我不确定你的术语,基类建议继承在这里不合适。在通知方面,关键是您的模型和视图模型之间存在阻抗不匹配,因为它们没有对同一事物进行建模。您的视图模型可能会使用视图所需的其他属性来增加模型的形状。您也可能不希望或不需要将所有模型属性公开给您的视图,因此任何关于它们差异的自动通知无论如何都不合适。
    • “所以任何自动通知他们的差异都不合适”我不得不不同意这个说法。但我同意你给出的总体答案。感谢您的澄清,感谢它。
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多