复合DTO中的DTO是应该通过主键还是通过对象引用相互引用?

时间:2011-02-19 10:16:08

标签: oop design-patterns architecture dto data-transfer-objects

建议transfer objects should not contain object references to other transfer objects。相反,他们应该使用其他传输对象的主键作为外键字段。

以订单和客户为实体的简单示例

显然,包含没有客户详细信息的订单列表的OrderListDTO将包含订购客户详细信息的外键。

复合DTO OrderWithCustomerDTO将具有对OrderDTO和CustomerDTO的对象引用。但是,在这种情况下,嵌入式OrderDTO本身是否有对其CustomerDTO的对象引用?或者它应该使用订购客户的主键吗?

对象引用的指示

一个优点是客户端可以直接使用传输对象,例如作为演示模型。我倾向于接受这种方法来处理总是完全自包含的传输对象,例如:具有相关DTO或完整树的复合DTO。客户可以依赖自我控制。客户端根本不需要对传输对象进行后处理。

将主键指示为外键

优点是内部和外部引用的处理方式相同。我倾向于要求这种方法用于可能包含外部引用的传输对象,例如带有外部childIds的子树。客户端必须遍历完整列表以解析外部childIds。

使用树或子树的更复杂的示例

现在讨论的传输对象是树或子树。从技术上讲,它是一个节点列表。

如果传输对象中的节点通过对象引用(如下面的NodeTOWithObjectReferences)相互引用,是否可以?

public class NodeTOWithObjectReferences implements Serializable {
    private long id;
    private NodeTOWithObjectReferences parent;
    private List<NodeTOWithObjectReferences> children;
}

或者传输对象是否必须通过外键字段替换每个对象引用,如下面的NodesTOWithForeignKeys?

public class NodesTOWithForeignKeys implements Serializable {
    private List<NodeDetail> children;
}

public class NodeDetail implements Serializable {
    private long id;
    private long parentId;
    private List<Long> childIds;
}


(我选择传输对象来封装来自客户端的域模型,并提供客户端特定的数据视图。)

1 个答案:

答案 0 :(得分:3)

  

作为一般性建议,转让   对象不应包含对象   对其他对象的引用。代替,   他们应该使用主键   其他对象作为外键   字段。

您是否可以附加指向此推荐来源的链接?这对我来说至少不是显而易见的。

在我当前的项目中,我使用包含对象引用的传输对象。这很方便,我还没有遇到任何问题。