【发布时间】: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