Dropthings是一款完全开源的Portal网站,从网上可以下到它的源码,作者为这个网站还专门写了一本书《ASP.NET 3.5构建Web 2.0门户网站》,网站用了很多新的开发技术和很多非常好的开发技巧,对它进行研究可以说受益匪浅。网页逻辑编程用到的日志记录用到了一个相当轻量以至于你乍一眼看它都不像AOP框架的AspectF。
- 基本概念
AOP(Aspect Oriented Programming):面向方面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
扩展方法:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。
可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。 编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。
- 动手开发AspectF
明确了上面两个概念后,就可以动手开发一个AOP框架了,通过对AspectF代码反编译,可以简单的实现之。
AspectExtensions是对AspectF类的扩展,通过代码可以看到AspectF并不像通常意义上的AOP实现,而更像是一个方法链。
代码不需要使用特性,也不用引用企业库。
Chains属性用于放置方法链,Define是静态的实例方法,Do则传入一个无参无返回值的方法,这几个都比较简单。
关键就在于链接方法的Combine方法,这里的原理就是一层一层的嵌套,但是采用第三种方法会造成堆栈溢出。
Log方法内部在传入的执行方法前后分别插入了一行代码。
- 调用方法
调用AspectF进行开发,在Do方法里面放的是业务逻辑,这样就有效的分离了比如日志记录之类的代码和业务逻辑的混合,可以更关注业务逻辑的开发和也便于维护。
- 讨论
请注意Main方法里的两个combine方法的链接,有两个问题:
1、第一个combine里面如果没有work(),输出是什么?
2、第二个combine里面如果没有work(),输出是什么?
上面是第一个的输出,下面是第二个的输出。思考留给读者。
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。