【发布时间】:2013-03-17 15:28:46
【问题描述】:
我有一个显示人员列表的视图。对于所述视图,我创建了一个PersonListViewModel
class PersonListViewModel {
public IEnumerable<Person> People {get;set;}
public int TotalPersonCount {get;set;}
public int PeoplePerPage {get;set;}
public string OrganizationName {get;set;}
}
我的问题是关于Person 课程。 Person 类应该在哪里定义?我应该怎么称呼它?
这个问题是有界上下文或层之间映射类型的更一般问题的一个实例。我知道我可以使用 AutoMapper 等来做一些这样的工作,但是 AutoMapper 只是缓解了问题,并没有解决它。
以下是我考虑过的一些选项以及优缺点:
将PersonListViewModel 和Person 类放在同一个命名空间中,例如Whatever.Organization.ViewModels.
Pro:Person 类名显示了它是什么——一个人,以及这个类绑定到命名空间指定的上下文。
缺点:在我构建此Person 实例的演示者中,将(很可能)与来自业务域空间的Person 类发生冲突,因此我必须为其中一个添加前缀。
缺点:将不得不添加一个命名空间来包含视图模型(不一定是问题,因为你可能,我也确实已经有了视图模型的命名空间)。
在 PersonListViewModel 类中嵌套 Person。
Pro:可以为不同的视图模型有多个Person 类。
亲:Person 自然地作用于它所属的视图模型。
缺点:不能在视图和视图模型之间重用Person。 Inb4:我确实认为不应重用 ViewModel,我确实认为在适当的时候重用表示层中的非 ViewModel 对象定义。这种方法不允许这种重用,并且在 5% 的情况下是必要的 - 我不想创建不同的模式。
使用 *ViewModel 对每个表示层对象进行后缀
Pro:解决了重用和名称冲突的问题。
缺点:没有意义,因为Person 只是一个视图模型,当它包含视图的数据时,它可能是也可能不是这种情况——例如,如果将 person 实例提供给 [sub]view——那么,从技术上讲,它将是一个视图模型,但如果它被用作PersonListViewModel 的属性,那么Person 就不是一个视图模型(不超过TotalPersonCount 的int 是一个视图模型,它不是)。
到目前为止,我还没有一个能让我开心的解决方案。但是解决方案 #1 似乎是最正确的(理论上),但我仍然希望提出更好的解决方案。
【问题讨论】:
标签: c# asp.net-mvc oop