前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在.NET中实现AOP的7种姿势

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

作者头像
崔文远TroyCui
发布2019-02-26 11:36:12
4.3K0
发布2019-02-26 11:36:12
举报
文章被收录于专栏:远在上海远在上海

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年11月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档