重复使用DTO对象进行显示和编辑/创建

时间:2018-01-19 15:47:40

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

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

以下是实体类:

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

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

我们假设我们有2个视图:一个是网格中的简单列表视图,另一个是用于编辑实体数据的表单。所以,我开始为网格创建一个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和名称重复的模式。在这种情况下,类结构如下所示:

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
}

从阅读这个主题来看,似乎大多数答案都是&#34;取决于&#34;。

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

1 个答案:

答案 0 :(得分:0)

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

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

如果是DTO,他们会在这里帮助灵活地向前端提供数据。

做出有助于并支持灵活性的决策,为前端提供数据结构。

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