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



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

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

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

DomainEvents 可用于由 Spring 数据存储库管理的聚合根方法,以将该方法返回的事件发布为 Spring 应用程序事件。

TL;博士:

只需调用save或使用ApplicationEventPublisher手动注册事件即可。

一些背景:

根本的问题是JPA并没有很好地将其借给DDD。

由于它保存了会话中更改的所有内容,因此没有简单的钩子来放置所需的事件处理。

可以考虑检查会话本身或依赖 JPA 的生命周期事件,但这些事件基于没有(明确(方法来识别它所属的聚合根的实体。

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

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

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

我当前的解决方案是强制保存方法必须 在服务结束时显式调用。我使用了休眠 插入 preFlush 的拦截器,该拦截器会引发 发现聚合具有某些域事件时异常。

我发现问题已经解决。我可以问一下是否解决了吗 还是不是问题?

另外,我似乎无法关闭问题,请关闭它

积分归 https://jira.spring.io/secure/ViewProfile.jspa?name=teclxl

相关内容

  • 没有找到相关文章

最新更新