【问题标题】:Are aggregates and aggregate roots implemented as separate classes?聚合和聚合根是否实现为单独的类?
【发布时间】:2020-08-19 13:36:57
【问题描述】:

关于 DDD 的讨论如此之多,我希望能找到很多代码示例,这些示例是如何实现这些模式的。但就没那么幸运了。

让我困惑的是这个。是聚合类型的实体,表示为聚合根,还是作为单独的类实现?以下是几个例子,如果其中任何一个是正确的,请回答。

  1. 它们是不同的类
class Aggregate {
   private Entity aggregateRootEntity;
   //methods that keep invariants
}
  1. 没有单独的聚合类,而是聚合根类,代表聚合
class AggregateRootEntity {
   //id, fields, value objects references, other entities references
   //methods that keep invariants
}
  1. 任何实体都可以是一个聚合,如果它用于事务范围,保持不变量,并“聚合”一些值对象
//This is aggregate:
class Entity {
   private List<ValueObject> valueObjects;
   //id, fields
   //methods that keep invariants
}
   

【问题讨论】:

    标签: java domain-driven-design


    【解决方案1】:

    没有单独的聚合类,而是聚合根类,代表聚合

    这个。

    介绍 DDD 和“聚合”模式的参考书是 Eric Evans Domain Driven Design: Tackling Complexity int the Heart of Software

    第 5 章讨论在软件领域建模时使用的模式:实体、值、“领域服务”等。

    第 6 章讨论了生命周期管理,其中他谈到了工厂、存储库和聚合:

    AGGREGATE 是一组关联对象,我们将其视为一个单元,用于数据更改。每个聚合都有一个根和一个边界。边界定义了聚合内部的内容。根是聚合中包含的单个特定实体。根是 AGGREGATE 的唯一成员,允许外部对象持有对....的引用。

    如果您愿意,聚合是对象的,其中包括根对象,以及您可以通过遍历本地引用从根对象到达的其他对象。

    【讨论】:

    • 感谢您的回答。请再多说一点,只是为了彻底澄清:因此,聚合根和常规实体的类没有任何特殊属性来区分它们(例如实体和值对象的 ID 存在),但这是它们的角色造成的差异,而不是代码?
    • 是的,没错。在某些示例中,您会看到一个用于区分根的空“标记界面”。
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多