Claude Codeでドメインイベントを設計する:集約内イベント・ドメイン層の疎結合・副作用の分離
はじめに 「注文確定処理の中にメール送信・在庫更新・ポイント付与が混在して保守できない」——ドメインイベントで集約の状態変化を記録し、副作用をイベントハンドラーに分離する設計をClaude Codeに生成させる。 CLAUDE.mdにドメインイベント設計ルールを書く ## ドメインイベント設計ルール ### イベントの生成 - 集約のメソッドがドメインイベントを生成(return/throw...

Source: DEV Community
はじめに 「注文確定処理の中にメール送信・在庫更新・ポイント付与が混在して保守できない」——ドメインイベントで集約の状態変化を記録し、副作用をイベントハンドラーに分離する設計をClaude Codeに生成させる。 CLAUDE.mdにドメインイベント設計ルールを書く ## ドメインイベント設計ルール ### イベントの生成 - 集約のメソッドがドメインイベントを生成(return/throwではなく内部に蓄積) - イベントは過去形の名前(OrderPlaced, PaymentReceived) - イベントには何が起きたか(型+識別子+必要データ)を含める ### イベントの発行 - アプリケーション層がDBコミット後にドメインイベントを発行 - コミット前に発行しない(ロールバックしたイベントが発行されるのを防ぐ) - 発行はOutboxパターンと組み合わせてトランザクション保証 ### ハンドラーの設計 - 各ハンドラーは1つのイベントに対して1つの副作用を担当 - ハンドラーは失敗してもドメインの整合性に影響しない(副作用の分離) ドメインイベント実装の生成 ドメインイベントシステムを設計してください。 要件: - 集約内でのイベント蓄積 - DBコミット後のイベント発行 - イベントハンドラーの登録と実行 - アウトボックスとの統合 生成ファイル: src/domain/events/ 生成されるドメインイベント実装 // src/domain/events/domainEvent.ts — ドメインイベント基底 export interface DomainEvent { readonly eventId: string; readonly occurredAt: Date; readonly eventType: string; } export abstract class AggregateRoot { private _domainEvents: DomainEvent[] = []; protected addDomainEvent(event: DomainEvent): void { this._domainEvents.push(event); } // アプリケーション層がDBコミット後に呼ぶ collectDomainEvents(