英文原文:《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的普及和使用提高跟国外还是有几年的差距。