替代与CQRS的多对多关系

时间:2010-10-14 11:53:03

标签: architecture domain-driven-design cqrs dddd

我们如何使用CQRS / DDD模拟经典的多对多关系?

我知道DDD和CQRS的实现和解决方案往往都是针对特定领域的,因此可能很难对这个问题做出一般性回答。

但是,我们假设我们在 Book Author 之间有熟悉的关系。这是一种经典的多对多关系。

对我来说, Book Author 是两个不同的实体,每个属于自己的聚合根目录似乎是最自然的即可。因此,明确地模拟它们之间的多对多关系并不是可行的方法。

我们如何建模AddBookCommand?我们希望能够向我们的库中添加一本书,并以某种方式声明某个作者写了这个 Book 。我们如何建立(并坚持)这种关系?

Book 作者都不适合价值对象 ......

1 个答案:

答案 0 :(得分:36)

假设两者都是聚合,在添加新书时将您需要的任何作者数据复制到Book聚合中,以便任何后续命令都有足够的作者数据可供使用。现在,如果作者聚合需要有关作者编写的书籍的信息,那么它可以“订阅”NewBookAdded事件(从技术上讲,您可以通过NewBookAdded事件向作者聚合发送RegisterAsAuthorOfBook命令)。我认为可以用另一种方式对此进行建模,但我与书作者域并不是那么亲密。

底线是你没有真正存储多对多,因为它们不能扩展。您必须开始将它们(聚合)视为彼此发送消息。更大的问题是需要保持一致性以及在什么时间点需要保持一致。我们是否关心作者没有立即反映出一本新书被添加的事实,她/他是作者?作者是否希望对他/她撰写的书籍强制执行任何不变量(反之亦然)?

另一件事是停止面向数据和更多面向行为。书籍和作者聚合的行为是什么?这将告诉我们在哪一点需要哪些数据以及如何对其进行建模。

http://pastie.org/1220582首次尝试Book汇总。