如何范围C#视图模型

THX*_*138 5 c# oop asp.net-mvc

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

class PersonListViewModel { 
    public IEnumerable<Person> People {get;set;}
    public int TotalPersonCount {get;set;}
    public int PeoplePerPage {get;set;}
    public string OrganizationName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我的问题是关于Person上课.应该在哪里Person定义类?我应该怎么称呼它?

此问题是在有界上下文或层之间映射类型的更一般问题的实例.我知道我可以使用AutoMapper等来完成这项工作,但AutoMapper只能解决问题但却无法解决问题.

这里有一些我考虑过的优点和缺点:

将两个PersonListViewModelPerson类放在同一名称空间中,例如Whatever.Organization.ViewModels.

Pro:Person类名显示它是什么 - 一个人,以及该类绑定由namespace命名的上下文.Con:在我构建此Person实例的演示者中(很可能)会与Person业务域空间中的类发生冲突,因此我必须为其中一个实例添加前缀.Con:必须添加一个名称空间来包含视图模型(不一定是个问题,因为您可能已经拥有了视图模型的命名空间).

PersonPersonListViewModel课堂上筑巢. Pro:可以Person为不同的视图模型提供多个类.Pro:Person自然是作为它所属的视图模型的范围.Con:无法Person在视图和视图模型之间重用.Inb4:我确实认为ViewModels不会被重用,我相信它会在适当的时候在表示层中重用非viewmodel对象定义.这种方法不允许这样的重用,并且在有必要的情况下有5% - 我不想创建不同的模式.

使用*ViewModel Pro对每个表示层对象进行后缀:解决了重用和名称冲突的问题.Con:没有意义,因为Person它只是一个视图模型,当它包含一个视图的数据时,可能会或可能不是这种情况 - 例如,如果将person实例赋予[sub]视图 - 那么,从技术上讲,它将是视图模型,但如果它被用作属性上PersonListViewModel然后Person是不是一个视图模型(不超过intTotalPersonCount是一个视图模型,这是不).

到目前为止,我没有一个让我开心的解决方案.但解决方案#1似乎是最正确的(从理论上讲),我仍然希望建议一个更好的解决方案.

lev*_*nis 1

我会选择选项 3。Person如果 a 不包含视图的数据,为什么会将 a 传递给视图?ViewModel 通常应该只包含视图所需的数据。创建一个来为视图使用的跨域PersonViewModel传递数据并没有什么问题。Person如果视图不需要它,就不要传递它。

事实上,您正在创建一个,PersonListViewModel这意味着您正在对您认为的人员列表做一些演示性的事情。PersonViewModel因此,创建一个用于保存您将在视图中为列表中保存的每个人显示的显示数据的方法是非常有意义的。