5

我有一个显示人员列表的视图。对于所述视图,我创建了一个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.

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

在课堂PersonPersonListViewModel筑巢。 优点:可以为不同的视图模型有多个Person类。Pro:Person自然地作用于它所属的视图模型。缺点:不能Person在视图和视图模型之间重用。Inb4:我确实认为不应重用 ViewModel,我确实认为在适当的时候重用表示层中的非 ViewModel 对象定义。这种方法不允许这种重用,并且在 5% 的情况下是必要的——我不想创建不同的模式。

使用 *ViewModel Pro 对每个表示层对象进行后缀 :解决重用和名称冲突问题。缺点:没有意义,因为Person它只是一个包含视图数据的视图模型,这可能是也可能不是这种情况——例如,如果将 person 实例提供给 [sub]view——那么,从技术上讲,它将是视图模型,但如果它用作属性,PersonListViewModelPerson不是视图模型(不超过intofTotalPersonCount是视图模型,它不是)。

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

4

2 回答 2

1

我会选择选项 3。Person如果它不包含视图的数据,为什么还要将它传递给视图?通常,ViewModel 应该只包含视图所需的数据。PersonViewModel创建 a来传递数据以供Person视图使用并没有错。如果视图不需要它,请不要传递它。

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

于 2013-03-27T14:12:47.227 回答
0

我会坚持第三种选择。正如您所说,它允许在不同的视图模型之间使用它,并且当您循环遍历 Person 列表时,仅将单个 Person 元素传递给部分,我看不到任何 OOP 问题。

于 2013-03-27T14:27:09.023 回答