5

ドメインモデルからのサービス(Windsor IoCコンテナのようなプロセスローカルコンポーネントの意味で)を使用する可能性を比較しています。

これを実現する方法は3つあります。

  1. ドメインイベントを公開し、サービスレイヤーコードで処理する

  2. モデルオブジェクトのメソッドを介してサービスを注入する

  3. モデルオブジェクトにサービスを注入する

(4.サービスロケーターの使用)

1つ目は、非常に表現力豊かで反復的なパターンにつながり、ドメインイベントとハンドラーを手続き型で作成します。しかし、それはそれが使用される環境からのモデルの最良の分離を持っています(モデルは自己定義されます)。

2つ目は、メソッドの引数を長くし、カプセル化を破るように見えます(モデルオブジェクトのアクションに他のサービスが必要な場合は、すべての呼び出し元を変更する必要があります)。

3つ目は、現在のトランザクションに必要のない依存関係を注入します。また、このためにNHibernateを「拡張」する必要があります。他の推奨事項を読んでいるため、この方法は避けます。

これをドキュメントに書きたいので、いつどの方法を使用するかを読者に伝える必要があります。「ドメインイベントハンドラーをモデルアセンブリに配置する場合は、メソッドインジェクションを使用する」という方針に沿って何かを考えていますが、実際にはポイントに達していません。

このルールの提案はありますか?

4

1 に答える 1

8

AR(集約ルート)がサービスからのデータを必要とする場合、そのデータは依存関係(サービスではなく)として取得する必要があります。基本的に、ARはサービスについてまったく知りません。

一部のメソッドに、コンストラクターに挿入しても意味がない依存関係がある場合は、それをメソッド引数として渡します。ただし、サービスを渡す必要はないと思います(ただし、状況によって異なります)。必要なデータを直接渡す必要があります。

ARが何かを更新するためのサービスを必要とする何かを行う場合、メッセージ駆動型が進むべき道だと思います(イベントを生成します)。

NHibernateまたはその他の詳細については、ARはそれらについて知る必要はありません。ドメインの概念でない場合は、ARから遠ざけてください。

個人的には、サービスを必要としないようにARをモデル化しようとしています。複数のARがシナリオに関与している場合は、信頼性の高いサービスバスでドメインイベントを使用します。これは、dbトランザクションが問題外であることを意味します。トランザクションはAR内、より正確にはARリポジトリにのみ保持します。他のすべてについては、結果整合性があります。

于 2013-01-07T12:43:36.750 に答える