【问题标题】:how to scope C# view models如何确定 C# 视图模型的范围
【发布时间】:2013-03-17 15:28:46
【问题描述】:

我有一个显示人员列表的视图。对于所述视图,我创建了一个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 类名显示了它是什么——一个人,以及这个类绑定到命名空间指定的上下文。 缺点:在我构建此Person 实例的演示者中,将(很可能)与来自业务域空间的Person 类发生冲突,因此我必须为其中一个添加前缀。 缺点:将不得不添加一个命名空间来包含视图模型(不一定是问题,因为你可能,我也确实已经有了视图模型的命名空间)。

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

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

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

【问题讨论】:

    标签: c# asp.net-mvc oop


    【解决方案1】:

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

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

    【讨论】:

    • *ViewModel 表示它是单个视图表示的抽象。 *ViewModel 并不意味着它有一个视图的 a piece 数据。 *ViewModel 是片段的复合构建,每个片段都是一个对象,每个片段不是视图模型。这就是为什么我不喜欢选项 #3 虽然它最方便。
    • 是的,这是一个有趣的观点。我喜欢明确区分明确用于展示的对象与明确属于领域的对象。添加 ViewModel 后缀可以很好地区分。
    • 是的,我同意。按照这个逻辑,来自业务层的 Person 应该被称为 PersonBusinessObject(看起来很奇怪),而 DAL 中的 Person 应该是 PersonEntity(这是一种常见的做法)。我不介意使用后缀本身,也许如果我找到一个后缀来表明Person 所属的层,而不是Person 扮演的(不正确的)角色。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2019-05-17
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多