4

制御の反転/アスペクト指向の意味でのプロキシ オブジェクトとは何ですか?

プロキシ オブジェクトとは何かについての良い記事はありますか?
なぜあなたはそれを使いたいのですか?
そして、C#でどのように書くのですか?

4

2 に答える 2

17

一般に、Proxyオブジェクトは、「実クラス」とまったく同じパブリックインターフェイスを公開するオブジェクト(クラスのインスタンス)ですが、そのメンバーに対して行われたすべての呼び出しを他の実クラスに転送するだけです。プロキシオブジェクトはさまざまな理由で使用されます...

1つの目的は、クライアントコンポーネント(またはオブジェクト)が「実際の」オブジェクトと通信していると「信じる」ことができるように、実際のクラスになりすますことですが、プロキシ内では、他のもの(ロギング、トランザクションサポートなど)です。 )が同時に実行されています...次に、プロキシは実際のオブジェクトと比較して非常に安価である可能性があります。多くの場合、クライアントが実際のオブジェクトを使用していないときに、実際のオブジェクトを保存(オフにするか、プールに解放して他のクライアントが使用できるようにする)できるようにするために使用されます...プロキシは「生きている」ままであり、クライアントはそれがまだあると考えます。実オブジェクトへの接続ですが、オブジェクトを「呼び出す」ときは常に、実際にはプロキシを呼び出しています。プロキシは、呼び出しを処理するためだけに別の実オブジェクトを取得し、呼び出しが完了すると実オブジェクトを解放します。

制御の反転(IOC)について。これは、クラス内の依存オブジェクトがクライアントコードからクラスのインスタンスに「注入」され、どのオブジェクトを制御するかを制御する一般的なパターン(依存性注入とも呼ばれる)を指します。インスタンスが使用する依存オブジェクトのバージョン...IOCを使用して、「プロキシ」オブジェクトをクラスに挿入し、実際のオブジェクトを使用していると見なすことができます...制御の反転というフレーズは、このパターンでは、実際の実装が呼び出されるかどうかの決定は、呼び出しを行うクラスの制御下ではなく、そのクラスのクライアントに対して、これに使用されるクラスに依存オブジェクトのインスタンスを注入するときに行われます。電話。

一般に、IOCという用語は、いわゆるIOCコンテナで使用されます、これは、ハードワイヤード依存関係以外のソース(ほとんどの場合、ある種の構成ファイル)から取得するクラス(タイプ)に関する緩く結合された情報に基づいて依存クラスのインスタンスを作成するように特別に設計されたクラスです。 。一般に、IOCコンテナーを使用する場合は、アプリケーションの起動時にそのインスタンスを作成し、(構成データなどを読み取ることによって)IOCコンテナーが担当する各クラス(タイプ)を「登録」します。 、キー値を使用します。キーは、多くの場合、この登録のすべてのインスタンスが実装する必要がある抽象型またはインターフェースです)。次に、アプリケーションの通常の操作で、これらのタイプのいずれかのインスタンスを新しく作成した可能性がある場合は、IOCコンテナーを呼び出し、代わりにインスタンスを要求します。抽象型/インターフェースをキーとして使用します。次に、IOCコンテナは、リフレクションまたは動的ロード(またはその他)を使用して、そのキーに「登録」されているタイプのインスタンスを作成します。このように、構成データを変更するだけで、アプリケーションで使用される実際のタイプを制御し、ある環境またはデプロイメントの場所でそれらを別の環境で使用されるものから変更できます。

于 2008-11-13T17:05:24.920 に答える
1

これに関する非常に優れたリソースは、古い「Gang of Four」デザイン パターンの本です。この本は、オブジェクト指向ソフトウェアを開発する人にとって非常に有用です。私は個人的に、NHibernate での遅延読み込みにプロキシ オブジェクトを使用しています。IoC でのみインターフェイス型を解決するため、制御の反転でプロキシを使用しません。

Charles Bretana の説明はとても良いです。

プロキシと AoP の関係が想像できません。誰かがここでそれを説明できますか?

于 2008-11-13T19:53:16.187 に答える