逻辑是:发布事件通知关闭netty channel 。之前,我通过 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.
最佳答案
TL;博士:
只需调用 save
无论如何或使用 ApplicationEventPublisher
手动注册事件。
一些背景:
根本问题是 JPA 并不能真正很好地适用于 DDD。
由于它保存了 session 内更改的所有内容,因此没有简单的 Hook 来放置所需的事件处理。
人们可能会考虑检查 session 本身或依赖 JPA 生命周期事件,但这些都是基于没有(明确)方法来识别其所属聚合根的实体。
想象一个Order
其中您更改 quantity
在其 LineItem
之一s。 JPA 将触发 LineItem
的事件但不适用于Order
,但是Order
是应该触发事件的聚合根。
所以无论哪种方式,它都是一个有漏洞的抽象。 Spring Data 依赖于适用于大多数(所有?)其他商店的保存方法。 大多数时候,这些商店都有更清晰的方法来识别聚合。 例如,MongoDb 的文档与聚合几乎是 1:1 匹配的。
关于java - 使用 Spring Data Common 发布领域事件时,如何处理没有存储库的聚合根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51998921/