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

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Aspect 指向のライブラリを複数対応できるようにしてみた

.NET Tips C# アルゴリズム

http://www.white-azalea.net/index.php/p/azaleaworks/downloads/

アップデートしてみました。
これで複数のアスペクトも同時実行できる。

namespace TestAspect
{
    class Program
    {
        static void Main(string[] args)
        {
            SampleTarget target = new SampleTarget();
            target.Hello("Azalea");
        }
    }

    // 可変長になったので何個でも。typeof はエレガントではないが、、、、
    // RealProxy 経由するので、ContextBoundObject も諦め。
    [AzaleaWorks.Aspect.Aspect(typeof(TestLogger), typeof(SubLogger))]
    class SampleTarget : ContextBoundObject
    {
        internal void Hello(string p)
        {
            Console.WriteLine("Message : {0}!", p);
        }
    }

    class TestLogger : AzaleaWorks.Aspect.ProxyBase
    {
        public override System.Runtime.Remoting.Messaging.IMessage
            InvokeMethod(System.Runtime.Remoting.Messaging.IMethodCallMessage iMethodCallMessage)
        {
            Console.WriteLine("Called method : {0}", iMethodCallMessage.MethodName);
            System.Runtime.Remoting.Messaging.IMessage result
                = base.InvokeMethod(iMethodCallMessage);
            Console.WriteLine("Exit   method : {0}", iMethodCallMessage.MethodName);
            return result;
        }
    }

    class SubLogger : AzaleaWorks.Aspect.ProxyBase
    {
        public override System.Runtime.Remoting.Messaging.IMessage
            InvokeMethod(System.Runtime.Remoting.Messaging.IMethodCallMessage iMethodCallMessage)
        {
            Console.WriteLine("Called sub : {0}", iMethodCallMessage.MethodName);
            System.Runtime.Remoting.Messaging.IMessage result
                = base.InvokeMethod(iMethodCallMessage);
            Console.WriteLine("Exit   sub : {0}", iMethodCallMessage.MethodName);
            return result;
        }
    }
}

仕様的には後で実装したほうが中央に近い子階層で動作する。
実行順序は予測できると思うけど、TestLogger → SubLogger

Called method : Hello
Called sub : Hello
Message : Azalea!
Exit   sub : Hello
Exit   method : Hello

次はキャッシュ仕様のものも考えてみる。
キャッシュ仕様は一つのインスタンスを使いまわすので実行が早く、キャッシュにセットさえできるなら、事前に好きな形で初期化できるのが強み。
欠点というか微妙なところは、オブジェクトごとに固有のアスペクトを設定するには手間がかかることかね?