簡體   English   中英

使用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 可用於 Spring Data 存儲庫管理的聚合根的方法,以將該方法返回的事件發布為 Spring 應用程序事件。

TL;博士:

只需調用save或使用ApplicationEventPublisher手動注冊事件。

一些背景:

潛在的問題是 JPA 並不能很好地適用於 DDD。

由於它保存了會話中更改的所有內容,因此沒有簡單的掛鈎可以放入所需的事件處理。

人們可能會考慮檢查會話本身或依賴 JPA 生命周期事件,但這些都是基於沒有(明確)方法來識別它所屬的聚合根的實體。

想象一個Order ,您更改其中一個LineItemquantity 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM