Aspect 指向のライブラリを複数対応できるようにしてみた
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
次はキャッシュ仕様のものも考えてみる。
キャッシュ仕様は一つのインスタンスを使いまわすので実行が早く、キャッシュにセットさえできるなら、事前に好きな形で初期化できるのが強み。
欠点というか微妙なところは、オブジェクトごとに固有のアスペクトを設定するには手間がかかることかね?