在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配置。但是我应该考虑哪些缺点?
答案 0 :(得分:0)
如果您对多个实体有很多用法,则第三个选项很有意义。
重用代码很好,但不要使代码的可读性和可理解性降低。
如果是DTO,他们会在这里帮助灵活地向前端提供数据。
做出有助于并支持灵活性的决策,为前端提供数据结构。
我以前使用过你的第三个选项,在大多数情况下这是正确的。但是,遇到新案例时,请始终牢记可读性和灵活性。