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

本文介绍了一个基于Microsoft.Practices.Unity.Interception的拦截代理实现案例。通过定义InterceptingRealProxy类和一系列行为处理类,实现了对目标对象方法调用的前置与后置拦截,并通过测试验证了整个流程的有效性。

参考:

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!

源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值