從聚合根釋出事件
由儲存庫管理的實體是聚合根。在領域驅動設計(DDD)應用程式中,這些聚合根通常會發布領域事件。Spring Data 提供了一個名為 @DomainEvents 的註解,你可以將其用於聚合根的方法上,從而儘可能簡化事件的釋出,如下例所示
從聚合根暴露領域事件
class AnAggregateRoot {
@DomainEvents (1)
Collection<Object> domainEvents() {
// … return events you want to get published here
}
@AfterDomainEventPublication (2)
void callbackMethod() {
// … potentially clean up domain events list
}
}
| 1 | 使用 @DomainEvents 的方法可以返回單個事件例項或事件集合。它不能有任何引數。 |
| 2 | 所有事件釋出後,我們有一個帶有 @AfterDomainEventPublication 註解的方法。你可以使用它來清理要釋出的事件列表(以及其他用途)。 |
每當呼叫以下 Spring Data 儲存庫方法之一時,這些方法就會被呼叫:
-
save(…)、saveAll(…) -
delete(…)、deleteAll(…)、deleteAllInBatch(…)、deleteInBatch(…)
請注意,這些方法將聚合根例項作為引數。這就是為什麼 deleteById(…) 明顯缺失的原因,因為實現可能會選擇發出查詢刪除例項,這樣我們最初就無法訪問聚合例項。