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

标签 java spring-data publish-subscribe ddd-repositories domain-events

逻辑是:发布事件通知关闭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/

相关文章:

java - 渲染方法中的 for 循环问题(Libgdx)

java - Spring数据排序操作超出最大大小

wamp - Ratchet WAMP $topic 错误 :Call to a member function broadcast() on a non-object

python - wxPython 中的 sendMessage() takes at most 3 arguments (4 given) 错误

java - 排除特定时间范围的 Quartz 调度程序

java - 为什么 "out of range"不为 'substring(startIndex, endIndex)' 抛出

java - Spring Data Mongo 查询字段参数

javascript - 为什么 "opener.$(document).trigger(' 自定义 ')"不起作用?

java - 京都柜和Scala(Java) : Limit of DB files open?

java - Spring Data MongoDB 凭据