如何界定C#视图模型的范围

如何界定C#视图模型的范围,c#,asp.net-mvc,oop,C#,Asp.net Mvc,Oop,我有一个显示人员列表的视图。对于上述视图,我创建了一个PersonListViewModel class PersonListViewModel { public IEnumerable<Person> People {get;set;} public int TotalPersonCount {get;set;} public int PeoplePerPage {get;set;} public string OrganizationName {

我有一个显示人员列表的视图。对于上述视图,我创建了一个
PersonListViewModel

class PersonListViewModel { 
    public IEnumerable<Person> People {get;set;}
    public int TotalPersonCount {get;set;}
    public int PeoplePerPage {get;set;}
    public string OrganizationName {get;set;}
}
类PersonListViewModel{
公共IEnumerable人{get;set;}
公共int TotalPersonCount{get;set;}
public int PeoplePerPage{get;set;}
公共字符串OrganizationName{get;set;}
}
我的问题是关于人的。应该在哪里定义
Person
类?我该怎么称呼它呢

这个问题是有界上下文或层之间映射类型的更一般问题的一个实例。我知道我可以使用AutoMapper等来做一些这方面的工作,但AutoMapper只能缓解问题,但不能解决它

以下是我考虑过的一些选项以及优缺点:

PersonListViewModel
Person
类放在同一名称空间中,例如
which.Organization.ViewModels

Pro:
Person
类名显示了它是什么-一个Person,并且该类绑定到名称空间指定的上下文。 缺点:在我构建这个
Person
实例的演示程序中,它很可能会(很可能)与业务域空间中的
Person
类发生冲突,因此我必须在它们前面加上前缀。 缺点:必须添加一个名称空间来包含视图模型(这不一定是个问题,因为您和我可能已经有了视图模型的名称空间)

嵌套
Person
内部
PersonListViewModel
类。
Pro:对于不同的视图模型,可以有多个
Person
类。 Pro:
Person
的作用域自然是它所属的视图模型。 缺点:不能在视图和视图模型之间重用
Person
。Inb4:我确实认为ViewModels不应该被重用,我确实认为在适当的时候应该在表示层中重用非viewmodel对象定义。这种方法不允许这种重用,在5%的情况下是必要的——我不想创建不同的模式

用*ViewModel后缀每个表示层对象 Pro:解决了重用和名称冲突的问题。 Con:没有任何意义,因为当
Person
包含视图的数据时,它只是一个视图模型,可能是这样,也可能不是这样——例如,如果Person实例被赋予[sub]视图,那么从技术上讲,它将是一个视图模型,但如果将其用作
PersonListViewModel
上的属性,则
Person
不是视图模型(不超过
TotalPersonCount的
int
是视图模型,而不是视图模型)


到目前为止,我还没有一个能让我快乐的解决方案。但解决方案#1似乎是最正确的(从理论上讲),但我仍然希望能提出更好的解决方案。

我会选择方案3。如果一个
不包含视图的数据,为什么它会被传递给视图?ViewModels通常只应包含视图所需的数据。创建一个
PersonViewModel
来传递视图要使用的
Person
的数据没有什么错。如果视图不需要它,请不要将其传递


您正在创建一个
PersonListViewModel
这一事实意味着您正在对视图中的人员列表进行一些表示。因此,创建一个
PersonViewModel
来保存您将在视图中为列表中的每个人显示的显示数据是非常有意义的。

我坚持使用第三个选项。正如你所说的,它允许在不同的视图模型之间使用,我不认为当你在人员列表上循环时,将单个人员元素传递给partials有任何OOP问题。

*ViewModel意味着它是单个视图表示的抽象*ViewModel并不意味着它具有视图的一段数据*ViewModel是由多个部分组成的复合构建,每个部分都是一个对象,每个部分都不是视图模型。这就是为什么我不喜欢选项3,尽管它最方便。是的,这是一个有趣的观点。我喜欢明确区分清楚地表示的对象和清楚地属于领域的对象。添加ViewModel后缀可以很好地区分这一点。是的,我同意。根据该逻辑,来自业务层的人员应该被称为
PersonBusinessObject
(看起来很奇怪),DAL中的人员应该是
PersonEntity
(这是一种常见做法)。我不介意使用后缀本身,也许如果我找到一个后缀来表示
Person
所属的层,而不是
Person
扮演的(不正确的)角色。