我们如何使用CQRS / DDD模拟经典的多对多关系?
我知道DDD和CQRS的实现和解决方案往往都是针对特定领域的,因此可能很难对这个问题做出一般性回答。
但是,我们假设我们在 Book 和 Author 之间有熟悉的关系。这是一种经典的多对多关系。
对我来说, Book 和 Author 是两个不同的实体,每个属于自己的聚合根目录似乎是最自然的即可。因此,明确地模拟它们之间的多对多关系并不是可行的方法。
我们如何建模AddBookCommand?我们希望能够向我们的库中添加一本书,并以某种方式声明某个作者写了这个 Book 。我们如何建立(并坚持)这种关系?
Book 和作者都不适合价值对象 ......
答案 0 :(得分:36)
假设两者都是聚合,在添加新书时将您需要的任何作者数据复制到Book聚合中,以便任何后续命令都有足够的作者数据可供使用。现在,如果作者聚合需要有关作者编写的书籍的信息,那么它可以“订阅”NewBookAdded事件(从技术上讲,您可以通过NewBookAdded事件向作者聚合发送RegisterAsAuthorOfBook命令)。我认为可以用另一种方式对此进行建模,但我与书作者域并不是那么亲密。
底线是你没有真正存储多对多,因为它们不能扩展。您必须开始将它们(聚合)视为彼此发送消息。更大的问题是需要保持一致性以及在什么时间点需要保持一致。我们是否关心作者没有立即反映出一本新书被添加的事实,她/他是作者?作者是否希望对他/她撰写的书籍强制执行任何不变量(反之亦然)?
另一件事是停止面向数据和更多面向行为。书籍和作者聚合的行为是什么?这将告诉我们在哪一点需要哪些数据以及如何对其进行建模。
http://pastie.org/1220582首次尝试Book汇总。