官网:https://www.postsharp.net/aop.net/msil-injection
向切面编程的概念已经盛行很久了, 可以很好的将我们代码的各个关注方面分离开来.
比如: 事务, 日志, 异常处理, 数据缓存, 权限等等, 这些其实是可以和核心的业务逻辑分离处理的.
不知道大家有没有在项目中使用呢? 目前最盛行的要数Java移植过来的Spring.Net的框架了.
这一个框架PostSharp, 网上也有很多这个的介绍.
原理: PostSharp采用静态注入,而不是DynamicProxy的动态注入. 所谓静态注入,指的是在编译好的程序集中的类型或者某个方法里注入IL代码
(而不是在程序集的运行时注入),注入的地方称为"Join-Point".
| |
|
(这个图和下面比较的一段,借用另一位网友的,特声明)但是PostSharp是在你编译一个程序集的时候就把IL注入到程序集里去了。
PostSharp是如何起作用的呢?它是怎么把自己插入到编译器的编译生成过程的呢?
我们知道VS是通过MSBiuld来执行生成过程的,所以其实PostSharp是把自己作为一系列的Build Task来插入到生成过程的。
然后它修改了VS调用MSBiuld的默认配置。从而使VS的Build命令执行了它所指定的Task。
和以往基于 Dynamic Proxy 方式与 AOP 解决方案做个比较。
- 由于采用 MSIL Injection,因此静态代码注入的执行效率要高于使用 Reflection Emit。
- 使用 MSBuild Task,使得开发人员可以像使用编译器内置 Attribute 那样使用 AOP。
- 可以拦截任意方法,而 Dynamic Proxy 方式的 AOP 往往采取继承方式来拦截 Virtual 方法。
- 拥有更多的控制权。包括中断执行流程,修改参数和返回值等等。
- 还可以拦截 Field Access、Exception 等操作。
- 无需将对象创建代码改成 "new proxy()",更加透明。
- 可以使用通配符进行多重拦截匹配。
- 静态注入带来的问题更多的是注入代码的质量和调试复杂度。
老外的好文: