这篇文章用于存放我在阅读《悟道领域驱动设计》时,关于聚合与聚合根的笔记。

1.只能通过聚合根来修改内部对象,不能绕过聚合根。

2.就算想引用聚合根里面的对象,比如订单里面的订单项列表。那么订单这个聚合根提供的get方法也必须new 一个新列表返回!

3.只有聚合根有repository。(实体可以有factory)

4.设计聚合最好小而全,最好能做到一个实体就是聚合。但做不到也不强求,能满足要求即可,但切记不能过大,也不能太小。

5.聚合根不能在内部直接引用其他聚合根,只能根据唯一id去查询另一个聚合根,由服务进行统排。

6.一个事务只对一个聚合根保存生效。

7.跨聚合采用最终一致性(因为规定了第6条,所以在跨聚合中经常会对不同的表进行操作),具体可以由领域事件实现。

8.如果聚合根内部有一个实体列表(1:N关系)那么可以考虑把这个实体也变成聚合根,原聚合根只保留他的唯一id列表。如果是多对多关系,可以考虑再新建一个表示它们两个关系的聚合根。

9.为什么要拆分聚合根? 因为一个聚合根保留的信息越多,那么在并发的情况下,保存聚合根时冲突的概率就越大。比如我的用户保留了资源列表,而且我是保留了完整的资源信息,那么可能资源的信息修改(只是修改了资源的更新日期),也会导致我的用户保存失败(乐观锁,数据不一样)。但如果把资源单独变成聚合根,用户聚合只保留资源id那么将会避免这种情况。同时考虑资源跟用户是多对多的关系,所以最好最新建一个角色跟资源绑定的聚合根,角色聚合根里面不会有任何资源相关的信息。