替代与CQRS的多对多关系

Mar*_*ann 37 architecture domain-driven-design cqrs dddd

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

我知道DDD和CQRS实现和解决方案都倾向于特定于域,因此可能很难对这个问题提出一般性答案.

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

对我来说,Book and Author似乎是两个不同的实体,每个实体都属于它们自己的Aggregate Root.因此,明确地模拟它们之间的多对多关系并不是一种可行的方法.

我们如何建模AddBookCommand?我们希望能够在我们的图书馆中添加一本书,并以某种方式说明某位作者撰写本书.我们如何建模(并坚持)这种关系?

无论是还是作者似乎是不错的候选值对象 ...

Yve*_*out 35

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

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

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

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

  • 只是为了增加Yves的优秀答案,如果你更多地看待这种行为,那么你可能会发现书籍和作者聚合中的一个或两个(或两者都不是)实际上是价值对象.一旦我开始这样想,我发现我以前认为是实体的很多对象更好地建模为值对象,因此更简单.这一切都取决于当然的背景...... (7认同)
  • 谢谢,这真是一个很好的答案!我已经阅读了很多介绍性的CQRS文献,但我最近才开始,仍然需要进入心态:) (2认同)
  • 您能否更新链接(如果可用)?我想这是您描述的代码示例。 (2认同)