C# Data Transfer对象中的属性应该扩展外键还是仅仅公开其主键
我有一个EmployeeDTO,它在数据库中响应员工记录。Employee表与部门有关系,与权限有1对多关系 在“我的实体”中,这些实体表示为完全展开的部门属性和完全展开的权限对象列表C# Data Transfer对象中的属性应该扩展外键还是仅仅公开其主键,c#,design-patterns,data-transfer-objects,C#,Design Patterns,Data Transfer Objects,我有一个EmployeeDTO,它在数据库中响应员工记录。Employee表与部门有关系,与权限有1对多关系 在“我的实体”中,这些实体表示为完全展开的部门属性和完全展开的权限对象列表 问题是DTO是否应该具有DepartmentId的完全扩展DepartmentDTO属性?DTO是否应该有一个完全扩展的PermissionDTO属性列表PermissionId列表?是和否。这取决于通话以及每次通话是否需要所有额外属性。它还可能取决于您使用的ORM技术,该技术可以实现延迟加载,并可能影响您的决策
问题是DTO是否应该具有DepartmentId的完全扩展DepartmentDTO属性?DTO是否应该有一个完全扩展的PermissionDTO属性列表PermissionId列表?是和否。这取决于通话以及每次通话是否需要所有额外属性。它还可能取决于您使用的ORM技术,该技术可以实现延迟加载,并可能影响您的决策(如果您传递的是直线实体对象,尽管不建议这样做)
创建一个包含所有必要属性的案例DTO和一个或多个公开更多功能并用于其他方法的DTO对象是很常见的。例如,我有一个
BasicUser
类,它只包含UserName
和DisplayName
,我有User
,它包含更多的内容,包括权限
和继承自`BasicUser.就像设计中的一切一样,它取决于您的需要
- 如果您需要经常查看和 绑定到子属性,您需要 尽可能地简化 开发人员要使用DTO,您可以 想要显式的工厂方法来提供 您完全扩展了子属性
- 如果您想要代码的简单性,请不要 展开外键属性和 让开发者得到孩子 按键列出所需的对象/集合 根据需要
微软的实体框架,以及其他流行的业务对象框架,通过延迟加载来处理这个概念——只有在代码调用完整扩展的子属性时才能获取它。这可能是最灵活的解决方案,但有一点开销/延迟,因为子属性不能在与父对象相同的数据库调用中获取。这些当然不是纯粹的DTO。是的,如果您想要完全扩展子属性,如何处理递归问题?如果DTO相互引用,那么您将在很长一段时间内保持扩展。所以在编写DTO类时,我只存储其他DTO的唯一id,而不存储整个其他DTO本身?