示例#1
0
        public object Invoke(IInvocationInfo invocation)
        {

            var method = invocation.Proxy.Target.GetType().GetMethod(invocation.Method.Name);

            var joinPoint = new JoinPoint
            {
                Arguments = invocation.Arguments,

                MethodInfo = method,

                ReturnValue = null,

                TargetObject = invocation.Proxy.Target,

                TargetType = invocation.Proxy.Target.GetType(),

                ExecuteMethodFromProxy = (() =>
                {
                    var value = invocation.Proceed();

                    return value;
                }),
                
            };

            var typesToApply = _types.Where(x => _pointCut.CanApply(joinPoint, x)).ToArray();

            if (typesToApply.Length > 0)
            {
                var aspectsToApply = typesToApply.Select(x => _container.GetInstance(x) as IAspect).ToArray();

                aspectsToApply = aspectsToApply.OrderBy(x => x.GetOrder(joinPoint)).ToArray();

                var root = aspectsToApply[0];

                var aspect = root;

                for (var i = 1; i < aspectsToApply.Length; i++)
                {
                    aspect.NextAspect = aspectsToApply[i];

                    aspect = aspect.NextAspect;
                }

                root.Apply(joinPoint);

                return joinPoint.ReturnValue;
            }
            else
            {
                return invocation.Proceed();
            }

        }
示例#2
0
        public void Intercept(IInvocation invocation)
        {
            var joinPoint = new JoinPoint
            {
                Arguments = invocation.Arguments,

                MethodInfo = invocation.GetConcreteMethodInvocationTarget(),

                ReturnValue = invocation.ReturnValue,

                TargetObject = invocation.InvocationTarget,

                TargetType = invocation.TargetType,

                ExecuteMethodFromProxy = (() =>
                {
                    invocation.Proceed();

                    return invocation.ReturnValue;
                }),

                SetReturnValueToProxy = ((o) => invocation.ReturnValue = o)
            };

            var typesToApply = _types.Where(x => _pointCut.CanApply(joinPoint, x)).ToArray();

            if (typesToApply.Length > 0)
            {
                var aspectsToApply = typesToApply.Select(x => _container.Resolve(x) as IAspect).ToArray();

                aspectsToApply = aspectsToApply.OrderBy(x => x.GetOrder(joinPoint)).ToArray();

                var root = aspectsToApply[0];

                var aspect = root;

                for (var i = 1; i < aspectsToApply.Length; i++)
                {
                    aspect.NextAspect = aspectsToApply[i];

                    aspect = aspect.NextAspect;
                }

                root.Apply(joinPoint);
            }
            else
            {
                invocation.Proceed();
            }

        }