动态织入的AOP实现
来源:互联网 发布:内核参数优化 编辑:程序博客网 时间:2024/05/17 04:07
转载自:http://www.cnblogs.com/luminji/archive/2012/01/10/2318211.html
动态织入的AOP实现,有两种方法:
第一类,借助于Remoting命名空间下的几个类,通过获取当前上下文及反射的机制来实现,这需要被AOP的类需要继承自arshalByRefObject
或者ContextBoundObject;
第二类,原理是基于动态代理的思想,即在运行时动态构造一个原有类的子类,这样就可以在子类的重载方法中插入额外代码。
这两类方法,都有显著的不足,前者直接要求我们继承固定类,后者呢,除非父类方法被定义为virtual,或者方法定义于某个接口,否则就不能被重载,这就是得“拦截”并不是可以对任意的方法进行的。
动态织入局限于CLR的限制,不能实现对任何方法进行AOP,如果要突破这个限制,只能采用静态织入的方法,静态织入采用。静态织入突破OO设计模式,可以拦截所有的方法甚至构造函数或属性访问器,因为它是直接修改IL。还有,因为它在运行前修改原有程序集,也就基本不存在运行时的性能损失问题了。它的不足,一方面是框架较复杂,实现较麻烦,依赖于对底层的IL指令集的操纵;
一:继承自ContextBoundObject的实现
帮助类:
调用方:public
class
LogHandler : ICallHandler
{
/// <summary>
/// 执行顺序
/// </summary>
public
int
Order {
get
;
set
; }
public
IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine(
"方法名: {0}"
, input.MethodBase.Name);
Console.WriteLine(
"参数:"
);
for
(var i = 0; i < input.Arguments.Count; i++)
{
Console.WriteLine(
"{0}: {1}"
, input.Arguments.ParameterName(i), input.Arguments[i]);
}
Console.WriteLine(
"方法执行前的处理"
);
var retvalue = getNext()(input, getNext);
Console.WriteLine(
"方法执行后的处理"
);
return
retvalue;
}
}
public
class
LogHandlerAttribute : HandlerAttribute
{
public
override
ICallHandler CreateHandler(IUnityContainer container)
{
return
new
LogHandler();
}
}
public interface ISample{ [LogHandler] void DoSomething(); void DoSomethingNoAop();} class Sample1 : ISample{ public void DoSomething() { Console.WriteLine("Sample1 do something"); } public void DoSomethingNoAop() { Console.WriteLine("Sample1 do something no aop"); }} public class SampleClass{ [LogHandler] public virtual void SampleVirtual() { Console.WriteLine("Virtual method"); } public void Sample() { Console.WriteLine("Sampe method"); }} class Program { static void Main() { //针对接口 var container1 = new UnityContainer() .AddNewExtension<Interception>() .RegisterType<ISample, Sample1>(); container1 .Configure<Interception>() .SetInterceptorFor<ISample>(new InterfaceInterceptor()); container1 .Configure<Interception>() .SetInterceptorFor<SampleClass>(new VirtualMethodInterceptor()); var sample1 = container1.Resolve<ISample>(); sample1.DoSomething(); sample1.DoSomethingNoAop(); //针对虚拟方法 var sample2 = container1.Resolve<SampleClass>(); sample2.SampleVirtual(); sample2.Sample(); Console.ReadKey(); } }
可以看到,第二种方法是用Unity实现的,关于Unity,这里多说两句:
Unity的AOP可以从3种标记的情况拦截:
TransparentProxyInterceptor:直接在类的方法上进行标记,但是这个类必须继承MarshalByRefObject;
VirtualMethod:直接在类的虚方法上进行标记,如上文代码;
InterfaceInterceptor:在接口的方法上进行标记,如上文代码;
代码下载:ConsoleApplication1.rar,ConsoleApplication2.rar
- 动态织入的AOP实现
- 动态织入的AOP实现
- 动态织入的AOP实现
- AOP动态代理织入
- Spring AOP: 织入的顺序
- Spring AOP: 织入的顺序
- Spring AOP: 织入的顺序
- AOP织入时机
- Spring AOP 织入初探--通过架构看实现
- Spring 的AOP--spring框架动态实现AOP
- Spring_AOP_Proxy AOP动态代理的实现
- Spring_AOP_Proxy AOP动态代理的实现 .
- Spring AOP 的实现原理----动态代理
- AOP的简单实现---动态代理机制
- AOP动态代理的简单实现
- AOP的JDK动态代理实现
- spring对AOP的支持(JDK的动态代理实现AOP和CGLIB实现AOP)
- Spring-AOP更加细化的织入时机
- Mysql互为主从复制配置
- dedecms一些常用的标签属性讲解
- 设计桟的min、push以及pop的时间复杂度都是O(1)
- 我的首篇博客,关于ios开发中的delegate
- PowerPC上电复位的过程描述
- 动态织入的AOP实现
- SWT的替代品——WindowBuilder Pro
- FileStream、Stream 的 Read 与 Write 的工作原理浅谈
- 解决Windows Modules Installer服务无法启动
- 十九、一套规则限制的校验
- 如何进行个人知识管理?(一)
- shell编程用得到的正则表达式元字符
- [面经]百度商务搜索部实习生面经(已经被拒,倒在三面上了)
- 关于IRET指令