参考:
http://www.cnblogs.com/artech/archive/2008/01/31/1059492.html
http://www.cnblogs.com/artech/archive/2008/02/19/1073033.html
匿名委托(lambada):
http://www.cnblogs.com/yjmyzz/archive/2009/03/13/1410924.html
代码 // Microsoft.Practices.Unity.Interception.dll // 调用起点 public class InterceptingRealProxy : RealProxy, IRemotingTypeInfo, IInterceptingProxy{................................................... public override IMessage Invoke(IMessage msg) { Guard.ArgumentNotNull(msg, " msg " ); IMethodCallMessage callMessage = (IMethodCallMessage) msg; if (callMessage.MethodBase.DeclaringType == typeof (IInterceptingProxy)) { return this .HandleInterceptingProxyMethod(callMessage); } TransparentProxyMethodInvocation invocation = new TransparentProxyMethodInvocation(callMessage, this .target); return ((TransparentProxyMethodReturn) this .interceptorsPipeline.Invoke(invocation, delegate (IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { if (callMessage.MethodBase.DeclaringType.IsAssignableFrom( this .target.GetType())) { try { object returnValue = callMessage.MethodBase.Invoke( this .target, invocation.Arguments); return input.CreateMethodReturn(returnValue, invocation.Arguments); } catch (TargetInvocationException exception) { return input.CreateExceptionMethodReturn(exception.InnerException); } } return input.CreateExceptionMethodReturn( new InvalidOperationException(Resources.ExceptionAdditionalInterfaceNotImplemented)); })).ToMethodReturnMessage(); }............................................} // / /// 行为管线 public class InterceptionBehaviorPipeline{............. public IMethodReturn Invoke(IMethodInvocation input, InvokeInterceptionBehaviorDelegate target) { if ( this .interceptionBehaviors.Count == 0 ) { return target(input, null ); } int interceptorIndex = 0 ; return this .interceptionBehaviors[ 0 ].Invoke(input, delegate { interceptorIndex ++ ; if (interceptorIndex < this .interceptionBehaviors.Count) { IInterceptionBehavior local1 = this .interceptionBehaviors[interceptorIndex]; return new InvokeInterceptionBehaviorDelegate(local1.Invoke); } return target; }); }..............} /// /// 一个具体的CallHander public class OrderValidationCallHandler : ICallHandler{................ public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { if (input.Inputs.Count == 0 ){ return getNext()(input, getNext);} Order order = input.Inputs[ 0 ] as Order; if (order == null ){ return getNext()(input, getNext);} ................ if ( this .ValidateTotalPrice) { double totalPrice = 0 ; foreach (OrderItem item in order.Items) { totalPrice += item.Quantity * item.UnitPrice; } if (totalPrice != order.TotalPrice) { return input.CreateExceptionMethodReturn( new OrderValidationException( " The sum of the order item is not equal to the order total price! " )); } } return getNext()(input, getNext); } ................}///测试
代码 namespace PIAPTEST{ public delegate IMethodReturn InvokeInterceptionBehaviorDelegate(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext); public delegate InvokeInterceptionBehaviorDelegate GetNextInterceptionBehaviorDelegate(); public class IMethodReturn { public object ReturnValue { get ; set ; } } public class IMethodInvocation { public MethodBase MethodBase { get ; set ; } public object Target { get ; set ; } } public interface IInterceptionBehavior { IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext); } #region 一些实现 public class BehaviorA : IInterceptionBehavior { public string Id { get ; set ; } public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { Out.Write( " Behavior: " + Id + " ->Invoke Befor! " ); var r = getNext()(input, getNext); Out.Write( " Behavior: " + Id + " -> invoke After! " ); return r; } } #endregion public class InterceptionBehaviorPipeline { public readonly List < IInterceptionBehavior > interceptionBehaviors; // Properties public int Count { get { return this .interceptionBehaviors.Count; } } // Methods public InterceptionBehaviorPipeline() { this .interceptionBehaviors = new List < IInterceptionBehavior > (); } public IMethodReturn Invoke(IMethodInvocation input, InvokeInterceptionBehaviorDelegate target) { if ( this .interceptionBehaviors.Count == 0 ) { return target(input, null ); } int interceptorIndex = 0 ; return this .interceptionBehaviors[ 0 ].Invoke(input, delegate { interceptorIndex ++ ; if (interceptorIndex < this .interceptionBehaviors.Count) { IInterceptionBehavior local1 = this .interceptionBehaviors[interceptorIndex]; return new InvokeInterceptionBehaviorDelegate(local1.Invoke); } return target; }); } } public class InterceptionRealProxy { public InterceptionBehaviorPipeline Pipeline = new InterceptionBehaviorPipeline(); public object Invoke(BLLObj targetObj, string methodName, object [] args ) { IMethodInvocation invocation = new IMethodInvocation(); invocation.MethodBase = targetObj.GetType().GetMethod(methodName); invocation.Target = targetObj; return Pipeline.Invoke(invocation, delegate (IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { Out.Write( " 实际对象被调用! " ); return new IMethodReturn() { ReturnValue = invocation.MethodBase.Invoke(targetObj, args) }; }); } } public class Out { public static void Write( string msg) { HttpContext.Current.Response.Write(msg + " " ); } } public class BLLObj { public int Add( int a, int b) { return a + b; } }}
代码 private void TestPIAP() { var t = new InterceptionRealProxy(); t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 1号 " }); t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 2号 " }); t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 3号 " }); t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 4号 " }); t.Invoke( new BLLObj(), " Add " , new object []{ 1 , 3 }); }
//输出结果
Behavior:1号->Invoke Befor!Behavior:2号->Invoke Befor!Behavior:3号->Invoke Befor!Behavior:4号->Invoke Befor!实际对象被调用!Behavior:4号-> invoke After!Behavior:3号-> invoke After!Behavior:2号-> invoke After!Behavior:1号-> invoke After!