使用 Spring Data Common 发布域事件时如何处理没有存储库的聚合根
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 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.
长话短说:
无论如何只需调用 save
或使用 ApplicationEventPublisher
手动注册事件。
一些背景:
潜在的问题是 JPA 并没有真正将它借给 DDD。
由于它保存了会话中发生的所有更改,因此没有简单的挂钩来放入所需的事件处理。
人们可能会考虑检查会话本身或依赖 JPA 生命周期事件,但这些都是基于没有(明确)方式识别其所属聚合根的实体。
想象一个 Order
,您在其中一个 LineItem
中更改了 quantity
。 JPA 将为 LineItem
触发事件,但不会为 Order
触发事件,但 Order
是应该触发事件的聚合根。
所以无论哪种方式,它都是一个有漏洞的抽象。
Spring 数据依赖于适用于大多数(所有?)其他商店的保存方法。
大多数时候,这些商店都有更清晰的方法来识别聚合。
例如,MongoDb 的文档几乎 1:1 适合聚合。
我认为 https://github.com/spring-projects/spring-data-jpa/issues/1727 中描述了此问题的最佳解决方案:
My current solution is to force that the save method must be
explicitly called at the end of the service. I used a Hibernate
interceptor that was inserted into the preFlush, which throws an
exception when it finds that the aggregate has some domain events.
I found that the issue has become resolved. Can I ask if it is solved
or not a problem?
Also, I can't seem to close the issue, please close it
学分转至 https://jira.spring.io/secure/ViewProfile.jspa?name=teclxl
逻辑是:发布一个事件通知关闭一个netty通道。之前,通过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.
长话短说:
无论如何只需调用 save
或使用 ApplicationEventPublisher
手动注册事件。
一些背景:
潜在的问题是 JPA 并没有真正将它借给 DDD。
由于它保存了会话中发生的所有更改,因此没有简单的挂钩来放入所需的事件处理。
人们可能会考虑检查会话本身或依赖 JPA 生命周期事件,但这些都是基于没有(明确)方式识别其所属聚合根的实体。
想象一个 Order
,您在其中一个 LineItem
中更改了 quantity
。 JPA 将为 LineItem
触发事件,但不会为 Order
触发事件,但 Order
是应该触发事件的聚合根。
所以无论哪种方式,它都是一个有漏洞的抽象。 Spring 数据依赖于适用于大多数(所有?)其他商店的保存方法。 大多数时候,这些商店都有更清晰的方法来识别聚合。 例如,MongoDb 的文档几乎 1:1 适合聚合。
我认为 https://github.com/spring-projects/spring-data-jpa/issues/1727 中描述了此问题的最佳解决方案:
My current solution is to force that the save method must be explicitly called at the end of the service. I used a Hibernate interceptor that was inserted into the preFlush, which throws an exception when it finds that the aggregate has some domain events.
I found that the issue has become resolved. Can I ask if it is solved or not a problem?
Also, I can't seem to close the issue, please close it
学分转至 https://jira.spring.io/secure/ViewProfile.jspa?name=teclxl