我有一个显示人员列表的视图。对于所述视图,我创建了一个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
.
优点:Person
类名显示它是什么 - 一个人,以及这个类绑定到命名空间指定的上下文。缺点:在我构建此Person
实例的演示者中(很可能)会与业务域空间中的类发生冲突Person
,因此我必须为其中一个添加前缀。缺点:必须添加一个命名空间来包含视图模型(不一定是问题,因为你可能,我也确实已经有一个视图模型的命名空间)。
在课堂Person
内PersonListViewModel
筑巢。
优点:可以为不同的视图模型有多个Person
类。Pro:Person
自然地作用于它所属的视图模型。缺点:不能Person
在视图和视图模型之间重用。Inb4:我确实认为不应重用 ViewModel,我确实认为在适当的时候重用表示层中的非 ViewModel 对象定义。这种方法不允许这种重用,并且在 5% 的情况下是必要的——我不想创建不同的模式。
使用 *ViewModel Pro 对每个表示层对象进行后缀
:解决重用和名称冲突问题。缺点:没有意义,因为Person
它只是一个包含视图数据的视图模型,这可能是也可能不是这种情况——例如,如果将 person 实例提供给 [sub]view——那么,从技术上讲,它将是视图模型,但如果它用作属性,PersonListViewModel
则Person
不是视图模型(不超过int
ofTotalPersonCount
是视图模型,它不是)。
到目前为止,我还没有一个能让我开心的解决方案。但是解决方案#1 似乎是最正确的(从理论上讲),我仍然希望提出更好的解决方案。