Architecture 与CQR建立多对多关系的替代方案

Architecture 与CQR建立多对多关系的替代方案,architecture,domain-driven-design,cqrs,dddd,Architecture,Domain Driven Design,Cqrs,Dddd,我们如何用CQRS/DDD建模经典的多对多关系 我知道DDD和CQRS的实现和解决方案都是特定于领域的,所以可能很难对这个问题给出一个通用的答案 然而,让我们假设我们在书和作者之间有着熟悉的关系。这是一种典型的多对多关系 在我看来,书和作者是两个不同的实体,每个实体都属于自己的聚合根,这似乎是最自然的。因此,显式地建模它们之间的多对多关系不是一条可行的道路 我们如何建模AddBookCommand?我们希望能够将一本书添加到我们的库中,并以某种方式声明这本书是某位作者写的。我们如何建立(并保持)

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

我知道DDD和CQRS的实现和解决方案都是特定于领域的,所以可能很难对这个问题给出一个通用的答案

然而,让我们假设我们在书和作者之间有着熟悉的关系。这是一种典型的多对多关系

在我看来,书和作者是两个不同的实体,每个实体都属于自己的聚合根,这似乎是最自然的。因此,显式地建模它们之间的多对多关系不是一条可行的道路

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


Book和Author似乎都不是值对象的理想候选对象..

假设两者都是聚合,则在添加新书时将所需的任何作者数据复制到Book聚合中,以便任何后续命令都具有足够的作者数据。现在,如果作者聚合需要关于作者编写的书籍的信息,那么它可以“订阅”NewBookAdded事件(从技术上讲,您可以作为NewBookAdded事件的结果向作者聚合发送RegisterAuthorOfBook命令)。我想人们也可以用另一种方式来模拟这一点,但我对图书作者领域并不太熟悉

底线是,您并没有真正存储多对多,因为它们无法扩展。您必须开始将它们(聚合)看作是相互发送消息。更大的问题是什么需要保持一致,以及在什么时候需要保持一致。我们是否关心作者没有立即反映出添加了一本新书的事实,而她/他是这本书的作者?对于作者所写的书,是否有任何不变量需要强制执行(反之亦然)

另一件事是停止以数据为导向,而更多地以行为为导向。这本书和作者的行为是什么?这将说明在哪一点需要什么数据,以及应该如何建模


第一次尝试一下图书总量。

谢谢,这真是一个极好的答案!我已经阅读了很多介绍CQRS的文献,但我只是最近才开始,仍然需要进入思维模式:)只是为了补充Yves的优秀答案,如果你更多地观察行为,那么你可能会发现这本书和作者总结中的一个或两个(或两者都不是)实际上是价值对象。一旦我开始这样思考,我发现我以前认为是实体的许多对象都可以更好地建模为值对象,因此更简单。当然,这一切都取决于上下文……如果可以的话,你能更新链接吗?我想这是你描述的一个代码示例。