DDD领域驱动设计之聚合根、实体、值对象 DDD术语之:实体与值对象 使用 .NET 实现微服务域模型
领域驱动设计在互联网业务开发中的实践 领域驱动设计的基础知识总结

一、聚合根、实体、值对象的区别?

  1. 从标识的角度:
    聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法。
    2. 从是否只读的角度:
    聚合根除了唯一标识外,其他所有状态信息都理论上可变;实体是可变的;值对象是只读的;
    3. 从生命周期的角度:
    聚合根有独立的生命周期,实体的生命周期从属于其所属的聚合,实体完全由其所属的聚合根负责管理维护;值对象无生命周期可言,因为只是一个值;
    image.png
    DDD领域驱动设计之聚合根、实体、值对象 - 图2

    二、聚合根、实体、值对象对象之间如何建立关联?

    聚合根到聚合根:通过ID关联;
    聚合根到其内部的实体,直接对象引用;
    聚合根到值对象,直接对象引用;
    实体对其他对象的引用规则:1)能引用其所属聚合内的聚合根、实体、值对象;2)能引用外部聚合根,但推荐以ID的方式关联,另外也可以关联某个外部聚合内的实体,但必须是ID关联,否则就出现同一个实体的引用被两个聚合根持有,这是不允许的,一个实体的引用只能被其所属的聚合根持有;
    值对象对其他对象的引用规则:只需确保值对象是只读的即可,推荐值对象的所有属性都尽量是值对象;

    三、如何识别聚合与聚合根?

    明确含义:一个Bounded Context(限界上下文)可能包含多个聚合,每个聚合都有一个根实体,叫做聚合根;
    image.png
    识别顺序:先找出哪些实体可能是聚合根,再逐个分析每个聚合根的边界,即该聚合根应该聚合哪些实体或值对象;最后再划分Bounded Context;
    聚合边界确定法则:根据不变性约束规则(Invariant)。不变性规则有两类:

  2. 聚合边界内必须具有哪些信息,如果没有这些信息就不能称为一个有效的聚合;

  3. 聚合内的某些对象的状态必须满足某个业务规则;

    四、领域模型(实体、值对象)与数据模型示例

    image.png

    https://www.cnblogs.com/huilei/p/11866693.html

DDD领域驱动设计之聚合根、实体、值对象 - 图5
DDD领域驱动设计之聚合根、实体、值对象 - 图6DDD领域驱动设计之聚合根、实体、值对象 - 图7
下图是对酒店管理的子域和界限上下文的梳理:
DDD领域驱动设计之聚合根、实体、值对象 - 图8