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側の修正は(修正するしないも含めて)すぎもとさんにお任せします。

私が公開しているソースコードに関しては修正済み。

Seasar.Framework.Aop.DynamicProxy.DynamicAopProxy.cs