
























AOP的动态拦截已经有太多的文章了,但关于静态横切的实现却比较少,因此,我想提供一个实现思路来达到抛砖引玉的目的。
实现的思想主要如下:
将需要weave-in的源代码写入一个文件(例如 log.aspect),然后拦截new操作符(这可以参考其他人的文章,用ProxyAttribute加从MarshalByRefObject继承)或者构造的时候采用factory模式,返回要生成的对象的继承类,这里我采用的是生成一个临时的源文件,并采用CodeDom中的动态编译。基本上临时文件代码如下:
public class aop_Target : Target
{
//此处插入要weave-in的代码(从*.aspect中读取),例如
//public void Log(string msg)
//{
// 
//}
}
这样的实现比较简单,但效率一定是比较差的,相信采用Emit会有很大的提高。
最后,Weave-in的方法的调用只能采用反射加Invoke,这大概是一个比较大的弱点,但在完全采用C#编译器的前提下,大概也只能做到这样了。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。