wsky's blog,Record my technical life

just coding

导航

AOP->动态代理->Emit

认识AOP,因为它所具有的吸引力,AOP(面向方面)让我们只需要关注我们需要关注的那个方面,把无关业务的方面剥离,
RT,是一个对AOP的.net实现逐渐深入的认识过程,

在。net下实现AOP有这么几种思路:(仅是收集网上所提到的部分)

1.使用ContextAttribute和ContextBoundObject来对对象的方法进行拦截。
.net的上下文context就可看做是AOP的一种实现,可看看这篇http://www.cnblogs.com/TomCat007/archive/2008/05/19/1202845.html 上下文拦截,再回忆一下AOP的思想,你会突然发现这不就是一个实践。

2.使用Emit来,在运行时刻动态构建被织入代码后的类,当程序调用被织入类时,实际上调用的是被修改后的类。
如果你熟悉IL,那就对它不会陌生,它能实时在IL中发射发入IL代码,在MSDN里可以查到它的应用,“将指令放到实时 (JIT) 编译器的 Microsoft 中间语言 (MSIL) 流上。”这是MSDN的解释,这便是实现动态织入的关键了,顺带查询一下OpCode,这也是必须知道的,它是用来描述IL指令的一个结构,也就是说它便是指令。

这种方式相较于单纯的反射取得方法,效率性能上超出很多,基本上和手写代码是一样的。

3.使用Proxy模式
代理模式实现AOP,通过拦截来实现AOP,大部分现有的成熟框架是采用了这种方式,比如Castle project的动态代理(另外Castle的IOC容器基于动态代理技术是指动态织入,因而不存在性能问题);这种方式多是要求被拦截的对象要继承自指定类以实现拦截机制,
实现例子可参考:
http://www.cnblogs.com/woodhead/archive/2006/02/08/324312.html 这是该作者自行实现的拦截,比较粗糙,但是体现了思路
http://www.cnblogs.com/mixiaobo/articles/291115.html 这是利用Castle的动态代理技术实现的应用



最后来讨论Emit,如果你是第一次听说它,那么想必它提供的功能会让你很迷惑,但是如果看到了它所能做的事,你一定会很振奋的,动态的生成一个类,动态的实现一个方法,一个接口,没有工厂模式里的让人头痛的反射,
http://yzh.spaces.live.com/Blog/cns!E7D95A34BE5738F4!177.entry
http://www.moon-soft.com/doc/23252.htm
给出两个Emit的实例,会更好的理解它,看来为了获得更好性能,IL是我们所需要掌握的东西,《框架程序设计》一书中将IL做为一个大章节来详细的介绍,它就如面向对象的机器语言,通常不同高级语言提供的特性有所不同,CLR使得各种语言可以协作完成同一个开发任务,而IL则能获取CLR的所有功能,有必要的时候完全可以用IL来完成我们需要的代码,Emit便是一种体现。


此文在查阅了数篇相关技术文档和MSDN后而做的简要笔记,重点不在AOP的思想而在实现,。net下的实现思路以及由此引出的动态实现;



2008-5-21 huangxu

posted on 2008-05-21 22:54  wsky  阅读(1717)  评论(1编辑  收藏  举报