前段时间做一个权限系统,在考虑日志、异常接管、事务、缓存等等一些横向组件的架构分析,自然就想用AOP技术实现;这两天又重 新学习研究了PostSharp的架构与实现思想,将其融入现有框架;
由于采用 MSIL Injection,因此静态代码注入的执行效率要高于使用 Reflection Emit。 使用 MSBuild Task,使得开发人员可以像 使用编译器内置 Attribute 那样使用 AOP。 可以拦截任意方法,而 Dynamic Proxy 方式的 AOP 往往采取继承方式来拦截 Virtual 方法 。 拥有更多的控制权。包括中断执行流程,修改参数和返回值等等。 还可以拦截 Field Access、Exception 等操作。 无需将对象创建 代码改成 "new proxy()",更加透明。 可以使用通配符进行多重拦截匹配。 静态注入带来的问题更多的是注入代码的质量和调试复杂度 。 另外有一老外的Using AOP and PostSharp to Enhance Your CodeAB两部分,相当精彩,本文就是在参考这两篇好文的基础上做的。
我们假设有这么个场景,其实这也是实际业务中很常见的处理方式:有一定单管理模块,具备新增、删除两功能,我们在新增删除的时 候必须校验权限,在删除的时候还必须记录日志,出现异常了还必须捕捉并记录异常;
按以前的写法我们可能很麻烦,我们要如此这般的写:
01 public class XOrders
02 {
03 public bool Add(string id, string orderName)
04 {
05 try
06 {
07 if (User.AddEnable)
08 {
09 //TODO:新增订单的实现
10 Console.WriteLine("正在执行新增订单方法的操作,回车继续……");
11 Console.ReadLine();
12 Console.WriteLine("您添加订单成功:编号:{0},名称:{1}", id, orderName);
13 return true;
14 }
15 else
16 {
17 //
18 }
19 }
20 catch (Exception)
21 {
22 //TODO:记录异常的实现
23 throw;
24 }
25
26 return true;
27
28 }
29
30 public bool Delete(string id)
31 {
32 try
33 {
34 if (User.DeleteEnable)
35 {
36 //TODO:删除订单的实现
37 Console.WriteLine("您删除订单成功:编号:{0}", id);
38 }
39 else
40 {
41 //
42 }
43
44 }
45 catch (Exception)
46 {
47 //TODO:记录异常的实现
48 throw;
49 }
50
51 return true;
52 }