0

私は自分の WCF プロジェクトに Castle Windsor を採用していますが、これには本当に驚かされます。ただし、Castle Windsor がサポートしているかどうかよくわからないシナリオがあります。たとえば、次のチェーンされたインターセプターがあります

Interceptor 1 > Interceptor 2 > Interceptor 3 > Interceptor 4 > Real method

インターセプター 1 はいくつかのデータを返し、それをインターセプター 2 で利用できるようにしたい インターセプター 2 はそれを機能させ、インターセプター 3,4 で利用できるようにしたいデータを返します。実際のシナリオでは、WCF サービスがあり、Interceptor 1 はリクエスト ヘッダーを解析してヘッダー オブジェクト (ユーザー名、パスワードなど) にします。後者のインターセプターと実際のメソッドは、このヘッダー オブジェクトを利用します。セッション変数を使用してデータを転送できることは知っていますが、これを処理するための組み込みの、よりエレガントで信頼性の高い方法はありますか?

4

2 に答える 2

2

あなたが提案していること:

  1. 存在するインターセプターに依存するメソッドの実装を作成します
  2. インターセプター間の依存関係を導入します。

これらは両方とも悪いことです。

概念的には、インターセプターはデコレーター パターンの優れた実装です。別の言い方をすれば、インターセプターは動作を変更できますが、その下のレイヤーに対して透過的な方法で変更する必要があります。インターセプターは、呼び出されているもののパブリック インターフェイスまたは依存関係を変更しないでください。インターセプターは最終メソッドに依存できますが、最終メソッドはインターセプターに依存すべきではありません。

メソッドの呼び出しにヘッダー オブジェクトが必要な場合は、要件を満たす明示的な WCF 動作 (おそらくIDispatchMessageInspector ) を作成します。

次に、すべてのインターセプターと最終メソッドは、ヘッダー オブジェクトがそこにあると想定できます。これは、ヘッダー オブジェクトの作成がパブリック インターフェイスの一部であるためです (たとえば、属性を使用してメソッド実装に動作を設定することにより)。

おもしろいのは、メッセージ インスペクタの動作の実装が本質的にインターセプタと同じであることです。違いは、メソッドを明示的な動作に依存させることが明確であることです。メソッドを暗黙のインターセプターに依存させることはできません。

于 2012-10-26T15:05:53.163 に答える
1

これを行うための組み込みの方法はないと思います。セッションを使用することはできますが、抽象化を定義したいと思います。通信する必要のあるすべてのインターセプターに、その抽象化の同じインスタンスを注入できます。

于 2012-10-26T10:57:53.160 に答える