【问题标题】:How to publish event of a none AggregateRoot object?如何发布非聚合根对象的事件?
【发布时间】:2020-03-23 15:32:06
【问题描述】:

所以我在 微服务 环境中使用 NestJsCQRSDDD,其中 Eventstore 和 MySql 作为数据库。在 NestJS 中,为了发布事件,对象必须是 AggregateRoot 类型。因此,我以AggregateRoot 的类型将其保存到数据库后发布返回的对象。

我现在需要做的只是在Event 中按原样发布传入请求,其他服务将侦听该事件,而不需要它是AggregateRoot 类型。

示例:我有一个传入的OrderOrder-Microservice,其中包含其他微服务所需的对象(如Delivery-MicroserviceAssembly-Microservice)。我不需要将它保存在 order-ms 中就可以发布它,因为它包含我在 order-ms 中不一定需要的数据。

NestJs EventPublisher 要求对象的类型为 AggregateRoot。我应该如何将该事件发布到 EventStore?

【问题讨论】:

    标签: domain-driven-design nestjs cqrs event-sourcing


    【解决方案1】:

    它并不总是需要 AggregateRoot。

    【讨论】:

    • 谢谢,但现在出现此错误,我似乎不知道如何修复它{错误:错误请求:无法为命令 WriteEvents 解开网络包。}
    • 信息太少,很难提供帮助。但我认为错误的请求与 CQRS 和 EventBus 无关。
    • 我在网上找不到任何有用的东西,这是我的事件 { this._eventBus.publish(new OrderRequestedEvent(requestOrderDto))} 并且在事件处理程序中,在构造函数中得到相同的类型,每隔当我将 mergeObjectContext 与 commit() 一起使用时,事件发布工作正常,但如果我尝试使用 eventBus 进行切换,它就不起作用
    • 您能提供您的事件处理程序吗?并且教授认为异常出现在处理程序中?
    • 从'@nestjs/common'导入{记录器};从“@nestjs/cqrs”导入 { IEventHandler, EventsHandler };从'../../impl/order/order-requested.event'导入{ OrderRequestedEvent }; @EventsHandler(OrderRequestedEvent) 导出类 OrderRequestedHandler 实现 IEventHandler { handle(event: OrderRequestedEvent) { Logger.log(event, 'OrderRequestedEvent'); // 写在这里 } }
    【解决方案2】:

    确实,您可以从不同位置触发事件(如@maciej-sikorski mentions 在他对NestJS documentation 的引用中。

    但您必须在这里小心,因为这样做很容易破坏常见的 DDD / CQRS 概念和最佳实践。一般来说:

    • Command 在概念上更改 AggregateRoot 中的状态,Event 表示此状态。
    • AggregateRoot 用作 Orders 有界上下文的公共入口点(即“公共 API”)。
    • 事件是域的一部分,一旦提交,就应该与聚合根相关。

    所以不要在域对象之外的任何地方发出事件。但是没关系,例如将DeliveryAddressValidated 事件应用于来自名为DeliveryAddress 的值对象的聚合根,以确保填写所有地址字段并且地址存在。在提交 Order 聚合根时 - 当聚合处于一致状态时 - 此事件可以Delivery-Microservice 中获取。

    或者 - 鉴于您的 Order 收到它不需要的信息 - 您可以看看重新安排您的有界上下文。我不知道你的设计,但坚持交付域,你可以有一个 Saga 等待 OrderRequested 事件(指示订单有效,但交货地址数据+验证不是此过程的一部分)然后触发DeliverOrder 命令(或例如ValidateDelivery 命令)到Delivery-Microservice

    【讨论】:

      猜你喜欢
      • 2023-02-04
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多