崔文远 Troy Cui 老崔先生的上海生活、技术博客

在.NET中实现AOP的7种姿势

英文原文:《7 Approaches for AOP in .Net》,我是个搬运工。感觉大部分人推荐用PostSharp/Cecil,好用且高效。我看了一下,虽然PostSharp目前收费,但按照Developer授权的价格还可以接收的,工欲善其事必先利其器,值得的!

---------------------------------------------------------------------------------------
1、Remoting Proxies
优点:由于有.Net框架支持,容易实现
缺点:重量级较大,只能用于interface或MarshalByRefObjects

2、Deriving from ContextBoundObject
优点:最容易实现,原生支持调用截获
缺点:非常耗费性能

3、编译时生成子类
产品:( Rhino Proxy )
优点:容易理解
缺点:只能用于Interfaces 或 virtual方法

4、运行时生成子类
产品:( Castle Dynamic Proxy )
优点:容易理解,非常灵活
缺点:实现复杂 (但已有现成类库),只能用于Interfaces 或virtual方法

5、挂钩分析用的API
产品:( Type Mock )
有点:非常强大
缺点:性能存在疑问?实现复杂(用到COM,需要另一个运行程序,等等)

6、编译时IL修改 
产品:( Post Sharp / Cecil )
优点:非常强大,性能非常好。
缺点:非常难以实现

7、运行时修改IL
产品:( Post Sharp / Cecil )
优点:非常强大,性能很好
缺点:非常难以实现


通常自己写太费功夫,都是用现成的。多数类库都是dynamic proxy方式,如:
spring.net
Castle DynamicProxy
微软企业库的 Unity
FluentAOP

动态代理方式的缺点就是只能用于接口或虚方法,要事先设计好,不是很灵活。
要好用的话还是IL-Weaving方式的,就是PostSharp/Cecil,不过PostSharp是收费的。

-------------------------------------------------------------------------------------------

AOP相关术语

方面(Aspect)

一个Aspect指上文提到的横切关注点在编程中的具体实现,它包含一个横切关注点所需要实现的具体辅助功能。具体到代码中,Aspect可能会被实现为一个Class,一个Function或一个Attribute。

连接点(Join Point)

连接点指一个业务函数代码中的一个位置或时机,在这个位置或时机允许Aspect代码插入执行。常见的连接点有进入函数执行业务代码前时、执行完全部业务代码离开函数前、当有异常发生在异常处理代码执行前等等。

织入(Weaving)

织入指将指定的Aspect代码插入指定连接点,使得横切代码与业务代码交合在一起。

连接模型(JPM, Join Point Model)

JPM主要是面向方面语言(如AspectJ)或面向方面框架的语义模型。主要包含以下三点:有哪些可用连接点,如何指定连接点以及如何织入。

AOP的实现方式

一般来说,在纯编译型语言(如C、C++)等语言中实现AOP非常困难,必须完全从编译器角度入手。托管型语言(如C#,Java)中AOP的实现较容易,大的分类有两种:编译时AOP(静态织入)和运行时AOP(动态织入)。

-------------------------------------------------------------------------------------------

最后附上2008年的老文章,来自微软《Understanding AOP in .NET》,近10年过去了,产品的格局依然没大变化,国内.NET的普及和使用提高跟国外还是有几年的差距。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 1 浏览: 11
留言列表
发表留言
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。