前言
以下介紹一下 ABP 提供的 Publish Event 的方式(local event 及 distributed event),
local event bus
在 Aggreate Root Entity 使用 AddLocalEvent(event物件);
來加入要被 Publish 的 Event ,
透過 ILocalEventHandler<event物件>
來訂閱要 Handle 的 Event,例如,
1 | public void SetTime(DateTime startTime, DateTime endTime) |
- Handler 如果發生錯誤沒有 Handle 的話,會讓 DB 交易 Rollback
在 AppService 也可以使用 eventbus,注入 ILocalEventBus
,再透過 PublishAsync
1 | public class EventAppService : EventHubAppService, |
最好是在 Domain Services or Entity 中 Publish 會來的比較合適
因為在 AppService 可能會忘了 Publish
Local events 很適合用來實作一些 side-effects,
例如,某些狀態改變時,要做某些 Action
像上述範例是使用 Email 通知
- 不應該將 商業邏輯流程 交給 事件處理,以防整個過程難以掌控
- Domain Event(包含簡單資訊,Id, CustomId, ClientId)
- Intergation Event (包含詳細資訊,Id, CustomId, CustomName, ClientId, ClientName…)
distributed event bus
透過 message broker service, 像是 RabbitMQ or Kafka
在 Aggreate Root Entity 使用 AddDistributedEvent(ETO物件);
來加入要被 Publish 的 Event ,
1 | public void SetTime(DateTime startTime, DateTime endTime) |
- 跟 local event bus 不同的是,這裡傳遞的是類似 DTO 的 ETO(Event Transfer Object)
其他地方使用則注入 IDistributeEventBus
,然後使用 PublishAsync
1 | await _distributedEventBus.PublishAsync(ew EventTimeChangedEto{ |
An aggregate should preserve its validity and consistency by implementing business rules.
The domain layer is used to implement the core, application-independent domain logic of the solution.
參考資源
ABP Event Bus
Should you publish Domain Events or Integration Events?