c# - 如何限定 C# View 模型的范围

标签 c# asp.net-mvc oop

我有一个显示人员列表的 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 只是缓解了问题,并没有解决问题。

这里有一些我考虑过的选项以及优缺点:

PersonListViewModelPerson 类放在同一个命名空间中,例如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 模型(不超过 TotalPersonCount 的 int 是一个 View 模型,但它不是)。

到目前为止,我还没有让我满意的解决方案。但解决方案 #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/

相关文章:

c# - 将定制的 Linq-2-SQL 迁移到 Entity Framework

c# - 如何创建只读复选框 MVC?

c# - 在 ASP.net c# web 应用程序中显示警告框

c# - ASP.NET MVC 多个开始形式?

ios - Swift:UIViewController常用函数继承

java - 类是否必须位于同一继承树上才能具有 Has-A 关系

c# - 从数据表中选择两列之间的记录

c# - ObjectContext 实例已被处置,不能再使用

c# - MVC3中 'Model'的意义?

c++ 从函数返回对象?