仍在阅读和了解DDD,并尝试将其应用于我正在开展的项目中。我仍然试图绕过Aggregates并遇到一个有趣的问题。
假设我有2个聚合,1个拥有根目录实体,另一个拥有根目录的用户实体。
如果没有用户但是用户可以创建帐户,这就是为什么它们都作为自己聚合的根目录的原因。注意,它们的聚合包括其他实体,但这对我的问题并不重要。
一些商业规则: 1)创建帐户时,必须将其与用户关联。如果用户不存在,则必须先创建它。
2)删除帐户时,还必须删除其关联的用户。
3)创建用户时,不需要将其与帐户关联。
3)当用户被删除时,如果它与帐户相关联,则也必须将其删除。
由于帐户和用户形成自己的聚合,因此可能会有自己的存储库。这意味着每个存储库都将定义标准的Add,Delete,Find和Delete方法。
因此,在这些情况下,完成以下操作的最佳方法是: 1)当创建一个帐户时,我想我会在其用户属性上调用一个方法来验证用户确保它存在。这是对的吗?
2)删除帐户时,如何删除其关联的用户。从帐户Repoistory?但这不只是重复用户存储库中的代码吗?或者存储库可以引用并互相调用吗?
3)当用户被删除时,最好的方法是确定它是否与帐户相关联并删除它而没有代码重复(可能与第二个问题类似)。
我在某处读到如果逻辑跨越两个实体或聚合,请考虑使用服务。但是我对此并不满意,因为停止客户端(假设API将在未来发展,用户与其他演示文稿)绕过服务并只是调用存储库?
更新1:
刚才意识到这可能是一个相关的问题:How should I enforce relationships and constraints between aggregate roots?
答案 0 :(得分:6)
来自DDD书,p128:
任何跨越AGGREGATES的规则都不会在任何时候都是最新的。通过事件处理,批处理或其他更新机制,可以在特定时间内解决其他依赖关系。
现在,首先您需要与您的域专家一起清除它,这些规则中的哪一个是 true 不变量,这意味着 - 必须立即组成。如果存在这样的规则,则应该由聚合根强制执行,在这种情况下,您可以考虑将这两个聚合合并为一个。 如果没有这样的规则,那么,如上所述,最终的一致性将会如此。您可以考虑为此目的使用域事件。见Udi Dahan的post