【发布时间】:2010-01-28 20:09:05
【问题描述】:
在我的 ASP.NET 应用程序中,我有一个 Person 和一个 PersonViewModel。
我的Person 是由LinqToSql 生成的。它具有将持久保存在数据库中的属性。
我的PersonViewModel 拥有Person 所拥有的一切,加上几个“选择列表”,它们将用于填充组合框,以及一个FormattedPhoneNumber(基本上是一个带有破折号和括号的PhoneNumber添加)。
我最初只是在我的PersonViewModel 上创建了Person 属性,但我认为这意味着页面必须“知道”某个东西是Person 属性还是PersonViewModel 属性。例如,对于姓名,视图将请求pvm.Person.Name,但对于电话号码,视图将请求pvm.FormattedPhoneNumber。如果我使用继承,那么视图所需的一切都将始终是视图模型的直接属性,因此pvm.Name。
这听起来不错,但是这里没有真正的“is-a”关系(即,我认为说“a PersonViewModel is a @987654337 @),而且它似乎在“更喜欢组合而不是继承”的情况下飞行。不过,我很难想到我需要能够将Person 换成其他东西的能力。如果我这样做,它将不再是PersonViewModel。
你说什么?从Person 继承或将Person 保留为属性(或完全其他)?为什么?
更新
感谢大家的回答。
看起来继承的想法几乎被普遍拒绝了,并且出于一些合理的原因:
解耦类允许
ViewModel仅包含来自域模型的所需属性以及任何其他属性。通过继承,您自然会从域模型中公开所有公共属性,这可能不是一个好主意。ViewModel不会因为域模型更改而自动更改。正如 Jay 所说,解耦
ViewModel有助于特定于视图的验证。正如 Kieth 所提到的,使用 Mapper(例如 AutoMapper)可以消除在类之间映射公共属性时的大量繁琐工作。
【问题讨论】:
-
无论如何,过于“聪明”的代码几乎总是一种代码味道。
-
只有当聪明涉及到扭曲或卷积时。 干净 聪明的代码……很酷吗? (不是我想用的词,但我决定使用头韵)
标签: c# asp.net-mvc design-patterns