[英]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
,您更改其中一个LineItem
的quantity
。 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.