zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    适合于小团队产品迭代的APP测试流程
    【转】软件测试上线标准
    安全性测试之修改密码
    LoadRunner 实现监控Tomcat
    【转】人生应该接受的教育
    晓光聊《小厂如何做测试》
    由测试需要多少编程知识想到的
    12款很棒的浏览器兼容性测试工具推荐
    最近感悟测试人员需要的一种能力
    APP测试功能点总结
  • 原文地址:https://www.cnblogs.com/wdfrog/p/1859021.html
Copyright © 2011-2022 走看看