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(); } }
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(); } }