読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

Dynamic Proxy Classの原理

C# CodeProject

CodePeojectに楽しげな記事があったのでご紹介。
Dynamic Proxy Class (inject code routines dynamically in methods): Part - I - CodeProject

用は色いろ有るAOPフレームワークが、一体全体何をしているのかを紹介しているわけですが。よくあるシナリオとして、
あるクラスのメソッド実行の前と後に何か処理をする(ロギングとか)を考えます。

この記事で紹介されているのはContextBoundObjectを使った方法です。どういう仕組みかというと・・・

  1. ContextBoundObjectを継承したクラスは、ContextAttribute基底クラスを通じてIConceptPropertyオブジェクトを付加する事ができる。この仕組を使い、メソッドを引ったくりたいクラスに任意のConceptPropertyを注入する。
  2. 注入したConceptPropertyはIConceptPropertyインターフェイスと同時に、IContributeObjectSinkインターフェイスも実装する。IContributeObjectSinkインターフェイスにより、メソッド呼び出しチェーンに任意のMessageSinkを付加する事ができる。
  3. 付加したMeesageSink(IMessageSinkを実装したクラス)により、メソッド呼び出しの前後にコードを付加できるようになる。
        //メッセージチェインを実行し、その前後にメソッドを挟む
        public IMessage SyncProcessMessage(IMessage msg)
        {
            //メソッド実行前に実行
            Before((IMethodMessage) msg);
            //メソッド実行本体
            IMessage returnMethod = m_next.SyncProcessMessage(msg);
            //メソッド実行後に実行
            After((IMethodReturnMessage)returnMethod);
            return returnMethod;
        }

ちなみに、MSDNを覗きながら書いていたら

この API は、.NET Framework インフラストラクチャをサポートします。独自に作成したコードから直接使用するためのものではありません。

という記述が頻出で、やっぱAOPするのはなかなかに.NETの内部をしっかりわかってないとダメなんだなぁ・・・
いや実際、IContributeObjectSinkとIMessageSink周りは全然中身は理解できてません・・・。そもそもメソッドをプロクシ経由で呼び出すってのはどこで指定してるんだ??とか。。。(ContextAttributeを付加することがそういうことな気もしますが、、、わかんねえ!!)