ドメインイベントハンドラー - アプリケーションレイヤーの懸念に使用する必要がありますか?
-
08-10-2019 - |
質問
ドメインイベントを実装する場合、イベントハンドラーが純粋にドメインの懸念にのみ使用される場合。あなたがビジネスの専門家と話し合うこと、またはそれらはドメインモデルに興味を持っているものによって使用されることができますか?
これは、おそらく簡単な例で説明されている可能性が最も高いです。従業員に作業をスケジュールするためのカレンダーアプリケーションを検討してください。
次のドメインイベントがあるかもしれません...
AppitiontAdded AdpuictionRemoved AppointContentChanged Appointmoved
これらのイベントのハンドラーがあります。たとえば、従業員の勤務時間外の時間に予約が移動すると、警告フラグを設定します。
もちろん、これらのイベントに関心のあるアプリケーションの懸念があります。たとえば、カレンダーに予約が追加された場合、後で変更をコミットできるように作業単位に追加する必要があります。
これらのアプリケーションの懸念は、ドメインイベントの消費者である必要がありますか、それとも代わりに個別のシステムイベントを上げて処理する必要がありますか?
解決
DDDソリューションでイベントを使用する2つの十分に確立された方法があります。
最初のものはウディ・ダハンに基づいています イベントに関する記事. 。まだ読んでいない場合は、強くお勧めします。要約すると、Staticクラスを使用してイベントを公開すると書かれています に加えて 通常のORMスタイルの動作。顧客の注文コレクションに注文を追加します と イベントを公開します。ドメインの動作はトランザクション範囲内で実行されるため、イベントハンドラーも実行されます。また、オブジェクトを作業単位に手動で添付しないように、そこにあることを見つけることもできます。既存の動作を呼び出すことにより、新しい総根を作成する必要があります。
グレッグ・ヤングによって推進される別のオプションがあります。基本的には、状態を持続する手段としてイベントを使用しているイベントソーシングに基づいています。このアプローチでは、総根は通常、いくつかのインフラストラクチャ(ベース集約ルートクラスなど)を使用してイベントを適用します。 Applyは、ルートクラスのアグリゲートにイベントハンドラーを呼び出します と このイベントをバスで公開します(使用するバスの実装が何であれ)。
他のヒント
あなたがあなたのアプリケーションロジックがそれを必要とする場合、あなたがとにかくそれを使用せざるを得ないよりも、あなたがクロスカットの懸念を意味する場合。そのため、他のイベント処理コードと混合されます。
しかし、ドメインイベントが発生したときにいくつかの独立したことを行う必要がある場合は、個別のイベントハンドラーを使用する方がよいです(懸念の原則の分離を参照)。
ちなみに、最初のケースでは、ドメインロジックをイベント処理(インフラストラクチャ)ロジックと混合しないようにしてください。イベントハンドラーの左インフラストラクチャ/クロスカットに関するコードは、ドメインメソッドを呼び出します。ドメインオブジェクトのメソッド内にドメインコードを移動します。