Enterprise Library Policy Injection Application Block(5.0) 函数调用链整理

参考:

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
+ "<br/>");
}
}
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!

原文地址:https://www.cnblogs.com/wdfrog/p/1859021.html