DynamicAopProxy変更
某掲示板で指摘されていた事項に対応。といっても、既に私の公開しているソースとS2.NETで使用しているソースとでは違いがあるので、修正すべきと思われる点のみ言及する。
指摘されていた点を整理すると
1.DynamicProxyにより拡張されたメソッドもAOPの対象になってしまう
2.protectedスコープのメソッドもAOPの対象になってしまう
1.の症状に関して、最新の実装ではAspect適用対象のメソッドを拾う際、DynamicProxyによる拡張された型は使っていないのであり得ないはず。
interfaceメソッド以外でも対象になってしまう、という指摘もあったが、そもそもDynamicProxy方式は、interfaceメソッドの他にvirtualメソッドも対象なので、これは仕様どおりではないかと。
変更対象はSetUpAspectメソッドのみ
変更前
private void SetUpAspects() { ArrayList interceptorList = new ArrayList(); if (this.aspects != null) { MethodInfo methodInfos = this.type.GetMethods( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy); foreach (MethodInfo method in methodInfos) { if ( method.IsVirtual || this.type.IsInterface ) { foreach (IAspect aspect in this.aspects) { IPointcut pointcut = aspect.Pointcut; if (pointcut == null || pointcut.IsApplied(method)) { interceptorList.Add(aspect.MethodInterceptor); } } if (interceptorList.Count > 0) { IMethodInterceptor interceptors = (IMethodInterceptor[]) interceptorList.ToArray(typeof(IMethodInterceptor)); this.interceptors.Add(method, interceptors); } } } } }
変更後
private void SetUpAspects() { ArrayList interceptorList = new ArrayList(); if (this.aspects != null) { MethodInfo methodInfos = this.type.GetMethods(); foreach (MethodInfo method in methodInfos) { if ( method.IsVirtual || this.type.IsInterface ) { foreach (IAspect aspect in this.aspects) { IPointcut pointcut = aspect.Pointcut; if (pointcut == null || pointcut.IsApplied(method)) { interceptorList.Add(aspect.MethodInterceptor); } } if (interceptorList.Count > 0) { IMethodInterceptor interceptors = (IMethodInterceptor[]) interceptorList.ToArray(typeof(IMethodInterceptor)); this.interceptors.Add(method, interceptors); } } } } }
現在、テストできる環境に無いので、この修正で良いのかの確信はありません。S2.NET側の修正は(修正するしないも含めて)すぎもとさんにお任せします。
私が公開しているソースコードに関しては修正済み。