逻辑是:发布一个事件来通知关闭一个网络频道。之前,通过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