繁体   English   中英

使用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 可用于 Spring Data 存储库管理的聚合根的方法,以将该方法返回的事件发布为 Spring 应用程序事件。

TL;博士:

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

一些背景:

潜在的问题是 JPA 并不能很好地适用于 DDD。

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

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

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

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

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

我当前的解决方案是强制必须在服务结束时显式调用 save 方法。 我使用了一个插入到 preFlush 中的 Hibernate 拦截器,当它发现聚合有一些域事件时会抛出异常。

我发现问题已经解决了。 请问是解决了还是没有问题?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM