使用 Spring Data Common 发布域事件时如何处理没有存储库的聚合根

How to deal with the aggregate root without repository, when using Spring Data Common to publish domain events

逻辑是:发布一个事件通知关闭一个netty通道。之前,通过DomainEventPublish,我在域服务、应用服务或catch发布事件。现在,我发现这是错误的,因为只有聚合根才能发布域事件。

我计划重构发布域事件的方式,以使用 Spring Data Common。我可以设计一个名为 ChannelToClose 的聚合根,并使用一种方法来注册 NeedClose 事件,但我无法发布已注册的事件。 Spring Data Common 仅在执行save() 存储库时才发布已注册的事件,所以我不知道在不需要持久化聚合根时如何发布事件.

这是org.springframework.data.domain.DomainEvents的评论:

DomainEvents can be used on methods of aggregate roots managed by Spring Data repositories to publish the events returned by that method as Spring application events.

长话短说:

无论如何只需调用 save 或使用 ApplicationEventPublisher 手动注册事件。

一些背景:

潜在的问题是 JPA 并没有真正将它借给 DDD。

由于它保存了会话中发生的所有更改,因此没有简单的挂钩来放入所需的事件处理。

人们可能会考虑检查会话本身或依赖 JPA 生命周期事件,但这些都是基于没有(明确)方式识别其所属聚合根的实体。

想象一个 Order,您在其中一个 LineItem 中更改了 quantity。 JPA 将为 LineItem 触发事件,但不会为 Order 触发事件,但 Order 是应该触发事件的聚合根。

所以无论哪种方式,它都是一个有漏洞的抽象。 Spring 数据依赖于适用于大多数(所有?)其他商店的保存方法。 大多数时候,这些商店都有更清晰的方法来识别聚合。 例如,MongoDb 的文档几乎 1:1 适合聚合。

我认为 https://github.com/spring-projects/spring-data-jpa/issues/1727 中描述了此问题的最佳解决方案:

My current solution is to force that the save method must be explicitly called at the end of the service. I used a Hibernate interceptor that was inserted into the preFlush, which throws an exception when it finds that the aggregate has some domain events.

I found that the issue has become resolved. Can I ask if it is solved or not a problem?

Also, I can't seem to close the issue, please close it

学分转至 https://jira.spring.io/secure/ViewProfile.jspa?name=teclxl