领域驱动设计中的聚合根和实体

1.聚合根、实体、值对象的区别?spa

从标识的角度:对象

  聚合根具备全局的惟一标识,而实体只有在聚合内部有惟一的本地标识,值对象没有惟一标识,不存在这个值对象或那个值对象的说法;生命周期

从是否只读的角度:class

  聚合根除了惟一标识外,其余全部状态信息都理论上可变;实体是可变的;值对象是只读的;引用

从生命周期的角度:di

  聚合根有独立的生命周期,实体的生命周期从属于其所属的聚合,实体彻底由其所属的聚合根负责管理维护;值对象无生命周期可言,由于只是一个值;ant

 

2.聚合根、实体、值对象对象之间如何创建关联?co

  聚合根到聚合根:经过ID关联;管理

  聚合根到其内部的实体,直接对象引用;

  聚合根到值对象,直接对象引用;

  实体对其余对象的引用规则:

    ①能引用其所属聚合内的聚合根、实体、值对象;

    ②能引用外部聚合根,但推荐以ID的方式关联,另外也能够关联某个外部聚合内的实体,但必须是ID关联,不然就出现同一个实体的引用被两个

    聚合根持有,这是不容许的,一个实体的引用只能被其所属的聚合根持有;

  值对象对其余对象的引用规则:只需确保值对象是只读的便可,推荐值对象的全部属性都尽可能是值对象;

 

3.如何识别聚合与聚合根?

  明确含义:一个Bounded Context(界定的上下文)可能包含多个聚合,每一个聚合都有一个根实体,叫作聚合根;

  识别顺序:先找出哪些实体多是聚合根,再逐个分析每一个聚合根的边界,即该聚合根应该聚合哪些实体或值对象;最后再划分Bounded Context;

  聚合边界肯定法则:根据不变性约束规则(Invariant)。不变性规则有两类:

    ①聚合边界内必须具备哪些信息,若是没有这些信息就不能称为一个有效的聚合;

    ②聚合内的某些对象的状态必须知足某个业务规则;