首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何发布非AggregateRoot对象的事件?

如何发布非AggregateRoot对象的事件?
EN

Stack Overflow用户
提问于 2020-03-23 15:32:06
回答 2查看 930关注 0票数 2

因此,我使用NestJs、CQRS、DDD,在微服务环境中使用Eventstore和MySql作为数据库。在NestJS中,为了发布事件,对象需要类型为AggregateRoot。因此,我发布保存到数据库后返回的对象,使其类型为AggregateRoot

我现在需要做的就是发布一个传入的请求,就像在一个Event中一样,其他服务将监听该事件,而不需要它的类型为AggregateRoot

示例:我有一个传入的OrderOrder-Microservice,其中包含其他微服务所需的对象(比如Delivery-MicroserviceAssembly-Microservice)。我不需要按顺序保存它--ms才能发布它,因为它包含了我不一定需要的数据。

NestJs EventPublisher需要一个AggregateRoot类型的对象。我应该如何向EventStore发布该事件?

EN

回答 2

Stack Overflow用户

发布于 2020-03-24 07:26:52

它并不总是需要AggregateRoot。

票数 3
EN

Stack Overflow用户

发布于 2020-06-27 05:50:17

确实,您可以从不同的位置触发事件(如@maciej 提及在他对NestJS文档的引用中)。

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

  • Command在概念上改变AggregateRoot中的状态,Event表示这种状态。
  • AggregateRoot充当订单受限上下文的公共入口点(即“公共API”)。
  • 事件是域的一部分,一旦提交,事件应该与聚合根相关。

因此,不要在您的域对象之外的任何地方发出事件。但是,可以将DeliveryAddressValidated事件应用于名为DeliveryAddress的值对象的聚合根,以确保所有地址字段都被填充,并且地址存在。在提交Order聚合根目录(当聚合处于一致状态时)时,可以在Delivery-Microservice中获取此事件。

或者--如果您的Order接收到它不需要的信息--您可以重新安排有限制的上下文。我不知道您的设计,但是坚持传递域,您可以有一个等待Saga事件的OrderRequested事件(指示顺序是有效的,但传递地址数据+验证不是这个过程的一部分),然后触发一个DeliverOrder命令(例如,ValidateDelivery命令)到Delivery-Microservice

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60816637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档