【问题标题】:Reusing DTO objects for Display and Edit / Create重用 DTO 对象进行显示和编辑/创建
【发布时间】:2018-01-19 15:47:39
【问题描述】:

在一个 ASP.Net MVC 项目上工作,我们正在创建 DTO 对象以从我们的实体中捕获数据以用于我们的视图。让我们称我们的 DTO 对象为EntityDto,它映射到Entity。我们将添加一个User 类以及此示例的一部分。

这里是实体类:

public class User {
  public int Id;
  public string UserName;
}

public class Entity {
  public int Id;
  public string Name;
  public User AssignedTo;
}

假设我们有两个视图:一个是网格中的简单列表视图,另一个是用于编辑实体数据的表单。所以,我开始为网格创建一个 DTO。

public class EntityDto {
  public string Name;  // Entity.Name
  public string AssignedTo;  // ie: User.UserName
}

我将视图的模型指定为List<EntityDto> 类型。到目前为止,一切顺利。

在我的表单上编辑这个Entity,我需要显示和编辑数据,上面的 DTO 将不再工作:我需要将 User.Id 值存储在某个地方。

DTO 的一个原则是尽可能保持平坦,没有任何行为。基于以上要求,我认为我有以下三种选择:

选项 1: 创建一个新的 EntityDto,比如 EntitySaveDto 特定于新视图,反映我现在需要一个不同的字段集。由于零代码重用,对我来说这是最不可取的。

选项 2: 编辑我的 EntityDto 以添加我需要的缺失字段。然后某些字段将不会在其他上下文中使用(例如网格视图)。这意味着我将拥有以下 Dto:

public class EntityDto {
  public string Name;  // Entity.Name
  public int AssignedToId;  // ie: User.Id
  public string AssignedToName;  // ie: User.UserName
}

选项 3: 定义一个具有 Id 和 Name 对的帮助器 Dto 是否更好。我发现需要一个 Id 和一个 Name 的模式会重复。在这种情况下,类结构如下所示:

public class EntityLookupDto {
  public int Id;
  public string Name;
}

public class EntityDto {
  public string Name;
  public EntityLookupDto AssignedTo;  // where AssignedTo now has both the Id and Name for the associated User
}

从阅读该主题来看,似乎大多数答案都是“取决于”。

我的直觉告诉我,选项 3 将在应用程序的其他方面提供效率,例如我的 AutoMapper 配置。但是有没有我应该考虑的缺点?

【问题讨论】:

    标签: c# asp.net-mvc design-patterns dto


    【解决方案1】:

    如果您对多个实体有多种用途,则第三个选项很有意义。

    重用代码固然好,但不要降低代码的可读性和可理解性。

    如果是 DTO,它们可以帮助灵活地向前端提供数据。

    做出有助于和支持更好地为前端提供数据结构的灵活性的决策。

    我以前使用过您的第三个选项,它在大多数情况下都是正确的。但在遇到新案例时,请始终牢记可读性和灵活性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 2016-01-08
      • 2020-02-27
      • 2014-06-22
      • 2019-04-18
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多