【问题标题】:Alternatives to many-to-many relationships with CQRS与 CQRS 的多对多关系的替代方案
【发布时间】:2011-04-25 08:54:02
【问题描述】:

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

我知道 DDD 和 CQRS 的实施和解决方案往往是特定于领域的,因此可能很难对这个问题提出一个通用的答案。

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

对我来说,BookAuthor 是两个不同的 实体 似乎很自然,每个实体都属于自己的 聚合根。因此,显式建模它们之间的多对多关系并不是可行的方法。

我们如何为 AddBookCommand 建模?我们希望能够将一本书添加到我们的图书馆,并以某种方式声明特定的作者写了这本。我们如何建模(并保持)这种关系?

BookAuthor 似乎都不适合 Value Objects...

【问题讨论】:

    标签: architecture domain-driven-design cqrs dddd


    【解决方案1】:

    假设两者都是聚合,在添加新书时将您需要的任何作者数据复制到 Book 聚合中,以便任何后续命令都有足够的作者数据来处理。现在,如果 Author 聚合需要有关作者所写书籍的信息,那么它可以“订阅” NewBookAdded 事件(从技术上讲,您可以将 RegisterAsAuthorOfBook 命令发送到 Author 聚合作为 NewBookAdded 事件的结果)。我想人们也可以反过来建模,但我对 Book Author 域并不熟悉。

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

    另一件事是停止面向数据和更多面向行为。 Book 和 Author 聚合的行为是什么?这将说明在什么时候需要什么数据以及应该如何建模。

    http://pastie.org/1220582 首次尝试 Book 聚合。

    【讨论】:

    • 谢谢,这真的是一个很好的答案!我已经阅读了很多介绍 CQRS 的文献,但我最近才开始并且仍然需要进入心态:)
    • 只是为了补充 Yves 的出色答案,如果您更多地查看行为,那么您可能会发现书籍和作者聚合中的一个或两个(或两者都不是)实际上是价值对象。一旦我开始这样思考,我发现很多我以前认为是实体的对象被更好地建模为值对象,因此更简单。当然,这一切都取决于上下文......
    • 如果可用,请您更新链接吗?我想这是您描述的代码示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多