2

我对弄清楚这三者之间的区别感到有些困惑。假设我有一个客户 - > 地址关系,(JPA)分离实体也将有这个(假设是急切加载)。哪里需要额外的聚合根?哪里需要 DTO?这一切都差不多吗?

原因之一可能是符合 JPA 的实体有一些客户根本不感兴趣的信息,例如@Entity、。@Id@OneToMany

我可以使用 JAX-RS/-WS 轻松地将其转换为 JSON/XML,并且几乎每个客户端都可以处理它,那么哪里需要它呢?这一切都几乎相同还是我错过了一些重要的事情?

4

2 回答 2

3

如果您遵循 DDD 原则,无论您是否使用 JPA,您都将创建聚合根。这是 DDD 中非常基本的构建块之一。来自 Eric Evan 的 DDD 书:

聚合标记了在生命周期的每个阶段都必须维护不变量的范围。以下模式、工厂和存储库在聚合上运行。

DTO 和分离实体与 JPA(技术约束)相关。聚合根也是一个实体。当聚合根变得不受管理(通过持久性上下文)时,它被称为分离实体

也许您的问题可以改写为:我应该将聚合根返回为分离实体还是 DTO?答案是主观的,取决于您的环境。

将聚合根作为分离实体返回的好处是您不需要创建新的 DTO 类。您还可以调用聚合根拥有的方法。缺点是您通常不会出于性能原因填充完整的对象图,因为某些聚合根可能具有非常深的层次结构。如果处理不当,这将导致延迟加载异常。

返回 DTO 而不是聚合根被认为是更健壮的设计。您需要为聚合根的每个“用例”创建一个新的DTO。这对于小型系统来说可能太麻烦了,但是如果您使用的是 DDD,我相信您的要求很复杂。

于 2014-10-29T04:14:07.470 回答
1

嗯,我真的不明白你真正的需要是什么?您尝试使用 DDD 概念或 DTO 解决的问题是什么...

DTO 不能与聚合根(也是实体)相提并论,实体具有数据和行为(DTO 不是这种情况,只是数据)。

因此,域模型应该是域驱动的 ;-),并且一些构建块对于实现它很有用,例如:实体、聚合......当你使用 ORM 时,很难隔离你的域,所以你必须尝试在您的域中拥有一些纯净的东西,并且尽可能减少噪音。有很多策略可以解决它。

您可以在那里找到更多信息:http: //elegantcode.com/2009/11/13/dtos-ddd-the-anemic-domain-model/

于 2014-10-28T20:02:32.080 回答