【问题标题】:Aggregate root reference in another aggregate root在另一个聚合根中聚合根引用
【发布时间】:2018-08-12 12:04:13
【问题描述】:

我目前有两个聚合根 - CustomerAddressBook。两者都有一些需要保护的不变量。 Customer 引用了AddressBook,我不确定这是否是为我的域建模的正确方法,因为没有另一个就不能生存,而且由于应该使用工厂创建域对象,我觉得我不应该允许创建 @ 987654325@ 没有AddressBook 反之亦然,但显然需要在另一个之前创建一个。希望有道理。

我应该如何解决我的问题?

其他问题是:我们可以在单个事务中创建多个聚合根吗?我已经红了,在更新的情况下不应该这样做。

【问题讨论】:

    标签: java domain-driven-design aggregateroot


    【解决方案1】:

    我目前有两个聚合根 - Customer 和 AddressBook。两者都有一些需要保护的不变量。客户参考了地址簿,我不确定这是否是为我的域建模的正确方法,因为没有另一个人就无法生存

    如果没有另一个它们真的没有意义,您可能需要检查设计,看看它们是否真的属于同一一致性边界的一部分。

    我们可以在单个事务中创建多个聚合根吗?

    从技术上讲,是的。这可能不是一个好主意。

    当所有逻辑上不同的聚合存储在一起时,在单个事务中创建它们很简单。

    但这也引入了一个约束:这些聚合需要“一起”存储。如果您的所有聚合都在同一个关系数据库中,那么全有或全无事务不会成为问题。另一方面,如果每个聚合都被持久化到一个文档存储中,那么您需要一个允许您在同一次写入中插入多个文档的存储。

    如果您的聚合恰好存储在不同的文档存储中,那么协调写入变得更加困难。

    我想与他创建密切相关的通讯录......也许域事件会是一个更合适的选择?

    也许;使用域事件向处理程序发出信号以调用另一个事务是自动化工作的常见模式。请参阅Evolving Business Processes a la Lokad 以获得对流程管理器的良好介绍。

    【讨论】:

    • 感谢@VoiceOfUnreason 的回答。我可能无法很好地表达我的情况 - 当我创建 Customer 时,我想创建与他密切相关的 AddressBook - 最好的方法是什么?我想避免这种情况,我需要检查他是否已经创建了他的书(附加选择),或者每次我想为他添加新地址时我应该为他创建一个。也许域事件会是更合适的选择?
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2019-02-13
    • 2017-08-25
    相关资源
    最近更新 更多