1

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

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

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

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

4

1 回答 1

1

TL;博士:

只需调用save或使用ApplicationEventPublisher.

一些背景:

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

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

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

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

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

于 2018-08-29T09:39:24.347 回答