Domain driven design 如何发布none AggregateRoot对象的事件?

Domain driven design 如何发布none AggregateRoot对象的事件?,domain-driven-design,nestjs,cqrs,event-sourcing,Domain Driven Design,Nestjs,Cqrs,Event Sourcing,因此,我在一个microservices环境中使用NestJs和CQRS以及DDD,并将Eventstore和MySql作为数据库。在NestJS中,要发布事件,对象的类型必须是AggregateRoot。因此,我将在将其保存到数据库后返回的对象发布为AggregateRoot类型 我现在需要做的就是发布一个传入的请求,就像在事件中一样,其他服务将侦听该事件,而不需要它的类型为AggregateRoot 示例:我收到了一份订单到订单微服务,其中包含其他微服务所需的对象(如交付微服务和组装微服务)

因此,我在一个microservices环境中使用NestJsCQRS以及DDD,并将Eventstore和MySql作为数据库。在NestJS中,要发布事件,对象的类型必须是
AggregateRoot
。因此,我将在将其保存到数据库后返回的对象发布为
AggregateRoot
类型

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

示例:我收到了一份
订单
订单微服务
,其中包含其他微服务所需的对象(如
交付微服务
组装微服务
)。我不需要以ms的顺序保存它,以便能够发布它,因为它包含我在order-ms中不一定需要的数据


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

它并不总是需要AggregateRoot。

确实,您可以从不同的位置触发事件(如@maciej sikorski在他对

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

  • 命令
    从概念上更改
    AggregateRoot
    中的状态,
    事件
    表示此状态
  • AggregateRoot
    充当订单绑定上下文的公共入口点(即“公共API”)
  • 事件是域的一部分,提交后应与聚合根相关
因此,不要在域对象之外的任何地方发出事件。但是,可以从名为
DeliveryAddress
的值对象向聚合根应用
DeliveryAddressValidated
事件,以确保所有地址字段都已填充,并且地址存在。提交
订单时e聚合处于一致状态-此事件可在
交付微服务中拾取


或者,如果您的
订单
接收到它不需要的信息,您可以查看重新排列您的绑定上下文。我不知道您的设计,但坚持交付域,您可以有一个等待
orderrequest
事件的
Saga
(指示订单有效,但送货地址数据+验证不是此过程的一部分),然后触发
送货订单
命令(或例如
验证送货
命令)到
送货微服务

谢谢,但现在我收到了此错误,我似乎不知道如何修复它{错误:错误请求:无法打开命令WriteEvents的网络包。}信息太少,很难提供帮助。但我认为错误请求与CQRS和EventBus无关。我在网上找不到任何有帮助的内容这是我的事件{this.\u EventBus.publish(new OrderRequestedEvent(RequestdTo))}在事件处理程序中,我在构造函数中得到了相同的类型,在所有其他事件发布中,当我使用mergeObjectContext with commit()时,它工作得很好,但是如果我尝试使用eventBus进行切换,它就不工作了。您能提供您的事件处理程序吗?并告诉prof处理程序出现异常吗?导入{Logger}从“@nestjs/common”导入{IEventHandler,EventsHandler}从“@nestjs/cqrs”导入{OrderRequestedEvent}从“../../impl/order/order requested.event”;@EventsHandler(OrderRequestedEvent)导出类OrderRequestedHandler实现IEventHandler{handler{handler(事件:OrderRequestedEvent){Logger.log(事件,'OrderRequestedEvent');//在此处写入}