聚合(Aggregate)
聚合是领域驱动设计中维护业务一致性的重要模式,它将一组相关对象组合成一个逻辑单元。
汽车生产案例
在汽车制造厂中,聚合可以理解为:
- 整车装配(包含车身、发动机、变速箱等核心部件)
- 发动机总成(包含缸体、活塞、涡轮等关键零件)
- 生产线工位(包含设备、工具、操作手册等资源)
这些业务单元内部有明确的边界,外部只能通过聚合根访问。
主要特点
- 边界明确:定义哪些对象属于聚合
- 聚合根:唯一外部访问入口
- 一致性保证:内部对象状态保持一致
- 事务边界:通常一个聚合对应一个事务
示例
java
// 整车装配聚合
class CarAssembly {
private String assemblyId; // 聚合根
private Body body;
private Engine engine;
private Transmission transmission;
// 外部只能通过聚合根修改内部状态
public void installEngine(EngineSpec spec) {
// 业务规则校验
if (!body.isEngineCompatible(spec)) {
throw new IncompatibleEngineException();
}
this.engine = new Engine(spec);
}
}
// 发动机总成聚合
class EngineAssembly {
private String engineId; // 聚合根
private CylinderBlock block;
private List<Piston> pistons;
private Turbocharger turbo;
// 业务逻辑封装在聚合内部
public void assemble() {
// 装配逻辑和规则校验
}
}
设计原则
- 小聚合:尽量保持聚合小巧
- 强一致性:聚合内部保持强一致性
- 最终一致性:聚合间通过事件实现最终一致性
- 引用其他聚合:通过ID而非对象引用