数据传输对象中的属性是否应扩展外键或仅显示其主键

时间:2011-03-22 13:33:21

标签: c# design-patterns data-transfer-objects

我有一个EmployeeDTO,它在数据库中表示一个Employee记录。 Employee表与Department有关系,与Permission有1对多的关系。

在我的实体中,这些表示为完全展开的Department属性和完全展开的权限对象List。

问题是DTO是否应该完全扩展DepartmentId的DepartmentDTO属性? DTO是否应该具有PermissionId列表的完全展开的PermissionDTO属性列表?

2 个答案:

答案 0 :(得分:3)

就像设计中的一切一样,这取决于您的需求。

  • 如果你需要经常看到和 绑定到子属性,你想要 使它尽可能简单 开发人员可以使用您的DTO 想要明确的工厂方法 你完全扩展了儿童的财产。
  • 如果您想要简单的代码,请不要 扩展外键属性和 只是让开发者得到孩子 他们想要的对象/集合 根据需要。

你可能会在递归中遇到问题;你是否也扩展了Department对象的所有外键属性?如果在Department的子类中有另一个EmployeeDTO的引用怎么办?

Microsoft的Entity Framework以及其他流行的业务对象框架通过延迟加载来处理这个概念 - 只有在代码调用时才获取完整的扩展子属性。这可能是最灵活的解决方案,但由于无法在与父对象相同的数据库调用中获取子属性,因此具有一点开销/滞后。这些当然不是纯粹的DTO。

答案 1 :(得分:2)

是和否。这取决于电话,如果您在每次通话中都需要所有额外的属性。它还可能取决于您使用的ORM技术,它可以实现延迟加载并可能影响您的决策(如果您传递直接实体对象,但不推荐)。

通常创建一个包含所有必需属性的案例DTO和一个或多个DTO对象,这些对象公开更多功能并将其用于其他方法。例如,我有一个BasicUser类,其中只包含UserNameDisplayName,而我User包含更多内容,包括Permissions继承来自`BasicUser。