[英]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.