【问题标题】:CQRS command for processing and not for updating aggregateCQRS 命令用于处理而不是用于更新聚合
【发布时间】:2018-12-18 18:04:41
【问题描述】:

我有一个使用领域驱动设计原则开发的项目。它是基于使用轴突框架的 CQRS。 我有一个场景,我需要在特定命令的哪个位置使用聚合的状态在聚合中生成文档。我不需要将生成的文档的 id 存储在聚合中。但是我需要使用生成的文档的 id 从聚合中发布一个事件,因为另一个域需要该 id。

触发命令不是为了更新聚合状态,而是为了执行一些处理和发布事件以更新其他聚合,这是一种好习惯吗?

从聚合中发布事件而不是用于采购,仅用于更新另一个域是否也是一种好习惯?

【问题讨论】:

    标签: domain-driven-design cqrs axon


    【解决方案1】:

    所以基本上你想将一个 AR 用作另一个 AR 的工厂(在这种情况下为Document)?这实际上很常见,有助于忠实于无处不在的语言,而不是从无到有地产生 AR。

    我不确定 AXON 命令处理程序是如何工作的,以及之后状态是如何保持的,但我会这样做:

    //Handler
    Document doc = someAggregate.generateDocument(id, ...);
    documentRepository.save(doc);
    

    如果您真的不需要Document AR,您可以直接创建事件:

    DocumentGenerated event = someAggregate.generateDocument(id, ...);
    eventStore.append(event); 
    

    然后可以使用您现有的任何消息传递基础架构将DocumentGenerated 事件分派到其他上下文。

    【讨论】:

    • Axon 框架允许从另一个聚合创建聚合来解决这个问题。您可以通过在聚合范围内使用 AggregateLifecycle#createNew(Class, Callable<T>) 函数来做到这一点。
    【解决方案2】:

    我认为可能生成文档的操作应该是域服务。并且域事件将由域服务生成,这并不常见,但有可能。

    当然,您可以发布不用于采购的领域事件。其实不用ES也可以做CQRS。事件是 BC 之间异步通信的一种方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2022-03-21
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多