DDD:维护聚合的约束

9ee*_*ee1 1 java domain-driven-design repository aggregateroot aggregates

仍然阅读和学习DDD并尝试将其应用于我正在进行的项目.我仍然试图绕过Aggregates并遇到一个有趣的问题.

假设我有2个聚合,1个拥有root用户实体,另一个用户实体用于root用户.

没有用户但用户可以创建帐户,这就是为什么它们都作为自己的聚合的根.注意,它们的聚合包括其他实体,但这对我的问题并不重要.

一些业务规则:1)创建帐户时,它必须与用户关联.如果用户不存在,则必须先创建它.

2)删除帐户时,还必须删除其关联的用户.

3)创建用户时,不需要与帐户关联.

3)删除用户时,如果与帐户关联,则也必须删除.

由于帐户和用户形成自己的聚合,因此可能会有自己的存储库.这意味着每个存储库都将定义标准的Add,Delete,Find和Delete方法.

因此,在这些情况下,完成以下操作的最佳方法是:1)创建帐户时,我想我会在其用户属性上调用一个方法来验证用户确保它存在.这是正确的吗?

2)删除帐户时,如何删除其关联的用户.从帐户Repoistory?但这不只是重复用户存储库中的代码吗?或者存储库可以引用并互相调用吗?

3)当用户被删除时,最好的方法是确定它是否与帐户相关联并删除它而没有代码重复(可能与第二个问题类似).

我在某处读到如果逻辑跨越两个实体或聚合,请考虑使用服务.但我对此并不满意,因为什么阻止了客户端(假设API将在不断发展,用户将来还有其他演示文稿)绕过服务并只是调用存储库?

更新1:

刚刚意识到这可能是一个相关的问题:我应该如何在聚合根之间强制实现关系和约束?

Itz*_*ban 7

从DDD书,p128:

任何跨越AGGREGATES的规则都不会在任何时候都是最新的.通过事件处理,批处理或其他更新机制,可以在某个特定时间内解决其他依赖性.

现在,首先你需要与你的领域专家一起清除它,这些规则中的哪一个是真正的不变量,意思是 - 它必须立即组成.如果存在这样的规则,则应该由聚合根强制执行,在这种情况下,您可以考虑将这两个聚合合并为一个.如果没有这样的规则,那么,如上所述,最终的一致性将会如此.您可以考虑为此目的使用域事件.见Udi Dahan的帖子

Itzik Saban