Domain driven design 如何发布none AggregateRoot对象的事件?
因此,我在一个microservices环境中使用NestJs和CQRS以及DDD,并将Eventstore和MySql作为数据库。在NestJS中,要发布事件,对象的类型必须是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 示例:我收到了一份订单到订单微服务,其中包含其他微服务所需的对象(如交付微服务和组装微服务)
AggregateRoot
。因此,我将在将其保存到数据库后返回的对象发布为AggregateRoot
类型
我现在需要做的就是发布一个传入的请求,就像在事件中一样
,其他服务将侦听该事件,而不需要它的类型为AggregateRoot
示例:我收到了一份订单
到订单微服务
,其中包含其他微服务所需的对象(如交付微服务
和组装微服务
)。我不需要以ms的顺序保存它,以便能够发布它,因为它包含我在order-ms中不一定需要的数据
NestJs
EventPublisher
要求对象的类型为AggregateRoot
。如何将该事件发布到EventStore?它并不总是需要AggregateRoot。
确实,您可以从不同的位置触发事件(如@maciej sikorski在他对 但在这里您必须小心,因为这样做很容易破坏常见的DDD/CQRS概念和最佳实践。一般来说:
从概念上更改命令
中的状态,AggregateRoot
表示此状态事件
充当订单绑定上下文的公共入口点(即“公共API”)AggregateRoot
- 事件是域的一部分,提交后应与聚合根相关
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');//在此处写入}