ドメインイベント
定義
ドメインイベント(Domain Event)とは、ドメイン内で起きた重要な出来事を表す不変のオブジェクト。「〜された(過去形)」で命名する:
OrderPlaced(注文が確定された)
PaymentReceived(支払いが受け付けられた)
UserRegistered(ユーザーが登録された)
ItemShipped(商品が発送された)
ドメインイベントはある時点で起きた事実を記録するため、作成後に変更してはならない。
なぜ重要か
集約が別の集約に副作用を直接呼び出すと:
- 集約同士が結合し、変更の影響範囲が広がる
- トランザクションが複数の集約をまたぐ(集約の設計原則違反)
- 処理の因果関係がコードで追いにくくなる
ドメインイベントを介することで、副作用を宣言的に分離でき、集約同士は疎結合になる。
// イベントなし(密結合)
order.confirm() // 内部でInventory.reduce()とNotifier.send()を直接呼ぶ
// イベントあり(疎結合)
order.confirm() → OrderConfirmed イベントを発行
InventoryService が購読 → 在庫を減らす
NotificationService が購読 → メールを送る
適用場面
- ある集約の状態変化が他の集約に影響する
- 外部システム(メール・プッシュ通知・分析基盤)との統合
- 操作の監査ログ・イベントログを残す
- イベントソーシングでステートを再構築する
関連概念
出典
実践ドメイン駆動設計(Vaughn Vernon)第8章