我有一个显示人员列表的 View 。对于上述 View ,我创建了一个 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
。
Pro: Person
类名表明它是什么——一个人,这个类绑定(bind)到由命名空间指定的上下文。
缺点:在演示者中,我构建此 Person
实例(很可能)会与业务域空间中的 Person
类发生冲突,因此我必须为其中一个添加前缀。
缺点:将必须添加一个命名空间来包含 View 模型(不一定是问题,因为你可能,我也确实,已经有一个用于 View 模型的命名空间)。
在 PersonListViewModel
类中嵌套 Person
。
优点:可以为不同的 View 模型设置多个 Person
类。
优点:Person
自然限定在它所属的 View 模型中。
缺点:不能在 View 和 View 模型之间重用 Person
。 Inb4:我相信 ViewModels 不应该被重用,我相信它是在适当的时候在表现层重用一个非 viewmodel 对象定义。这种方法不允许这种重用,并且在 5% 的情况下是必要的——我不想创建不同的模式。
用 *ViewModel 后缀每个表示层对象
Pro:解决了重用和名称冲突的问题。
缺点:没有意义,因为 Person
只是一个 View 模型,当它包含 View 的数据时,情况可能是也可能不是——例如,如果将 person 实例提供给 [sub]view - 那么,从技术上讲,它将是一个 View 模型,但是如果它被用作 PersonListViewModel
的属性,那么 Person
就不是 View 模型(不超过
是一个 View 模型,但它不是)。TotalPersonCount
的 int
到目前为止,我还没有让我满意的解决方案。但解决方案 #1 似乎是最正确的(理论上来说),我仍然希望能提出更好的解决方案。
最佳答案
我会选择选项 3。如果 Person
不包含 View 的数据,为什么要将它传递给 View ? ViewModel 通常应该只包含 View 所需的数据。创建一个 PersonViewModel
来传递 Person
的数据并没有错,该数据将被 View 使用。如果 View 不需要它,请不要传递它。
您正在创建 PersonListViewModel
这一事实意味着您正在对您 View 中的人员列表进行展示。因此,创建一个 PersonViewModel
来保存您将在 View 中显示的列表中每个人的显示数据是非常有意义的。
关于c# - 如何限定 C# View 模型的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15660729/