如何范围C#视图模型

时间:2013-03-27 13:59:27

标签: 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 {get;set;}
}

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我会选择选项3.如果Person不包含视图数据,为什么会将PersonViewModel传递给视图? ViewModels通常应该只包含视图所需的数据。创建Person传递PersonListViewModel的数据并使视图使用该数据没有任何问题。如果视图不需要它,请不要传递它。

您创建PersonViewModel这一事实意味着您正在使用视图中的人员列表来表达某些内容。因此,创建{{1}}来保存您将在列表中显示的每个人的视图中显示的显示数据非常有意义。

答案 1 :(得分:0)

我坚持第三种选择。正如你所说它允许在不同的视图模型之间使用它,并且我没有看到任何OOP问题,只是在循环人员列表时将一个Person元素传递给partials。

相关问题