DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)
一个限界上下文包含一个或多个聚合,一个聚合由一个或多个实体以及值对象组成。
一个聚合有一个聚合根,访问聚合通过根ID。
聚合内部访问实体通过引用,一个聚合访问另一个聚合使用根ID,访问另一个聚合中的实体,采用深度遍历,先访问ID,其次找引用。
聚合实体状态可以改变;聚合中的实体状态可以改变;值对象不允许改变。
包含多实体的逻辑为领域服务;包含多聚合的逻辑为应用服务。
聚合的好处:
- 单一职责
- 高内聚
- 低耦合
对领域建模的步骤:
- 分析场景、用例、用户行为
- 得出业务行为、与事件交互
- 列出所有实体
- 列出各聚合的实体
- 找到各聚合的聚合根
- 找到各聚合根对应的实体与值对象(聚合图)
- 对象引用和依赖模型
判断聚合根的依据:
- 是否有生命周期
- 是否有全局唯一ID(参考今天讨论的库存领域,混箱的话就会包含多个Item,所以Item不能作为聚合根,应该寻找分析Item的上一级,可以是一批Item需要调整的一个单据,单据作为聚合根)
- 是否可以创建或修改其他对象
- 是否有特定模块操作此实体
一个微服务可以由一个或多个聚合组成,多聚合的微服务还可以再进行更细粒度的拆分或组合。