轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)
2010-01-08 00:00:00 来源:WEB开发网下面我们再次顺序的对上面例子的执行方式进行说明:
首先,系统检查到函数Test有Decorator,因为是倒序处理,所以,首先针对debugger,系统会直接执行debuggerWrapper,并将Test作为参数fun传入,debuggerWrapper函数执行完毕之后返回了debugging函数对象,于是,系统将Test偷换成 debugging,因此,如果执行Test方法,实际执行的debugging方法,继续,还有一个装饰器logger,同样的,系统会直接执行 loggerWrapper函数,并将当前的函数(注意,当前的函数不再是Test了,因为经过debuger的装饰,Test已经被debugging 所替代,因此,这儿传入的是debugging函数对象)作为参数fun传入,loggerWrapper方法执行之后会返回logging函数对象,该函数定义和Test完全一致,因此,系统又将该位置的debugging函数(Test在先前被debugging替换了)替换成logging函数,因此,该函数在整体执行的时候是直接跑去logging函数执行的。
在上面的例子中,系统调用Test函数实际执行logging函数,logging函数中调用fun(self)实际调用的是debugging(self),而debugging中调用的fun(self)才是真正的执行了Test方法。
三. 参考C#进行思考
看到如此简单实用的Decorator,是不是心动了呢?想办法也让C#能享受到这个好处吧。在C#中,Attribute的表现形式和Python很是相似,因此,我们考虑使用Attribute和一系列相关的操作来达到模拟Python的执行过程。
在C#中,函数对象由委托来进行描述,因此,我们考虑,同样的,让支持Decorator操作的Attribute实现一个特定的接口,该接口返回一个委托,然后,将实际执行该方法的时候去执行该委托,那么考虑以下形式:
01 public class MyClass{
02 [Logger(“Leven”)]
03 public string Test(string s) {
04 xxx
05 return xxx;
06 }
07 }
08
09 public delegate string TestMethodDelegate(string s);
10
11 public class LoggerAttribute : Attribute {
12 public string Name { get; private set; }
13
14 public LoggerAttribute(string name) {
15 Name = name;
16 }
17
18 TestMethodDelegate LoggerWrapper(TestMethodDelegate fun) {
19 return e => {
20 Console.WriteLine(“User is {0}.”, Name);
21 Console.WriteLine(“Start Logging”);
22 var result = Fun(e);
23 Console.WriteLine(“End Logging”);
24 return result;
25 }
26 }
27 }
- ››AOP的两个应用:实体集更新(DateEntityListUpdate...
- ››AOP的两个应用:实体集更新(DateEntityListUpdate...
- ››轻量级数据交换格式 JSON轻松入门
- ››轻量级系统 Lubuntu 10.04 发布
- ››AOP 的利器:ASM 3.0 介绍
- ››轻量级AOP框架-移植python的装饰器(Decorator)到C...
- ››轻量级AOP框架-移植python的装饰器(Decorator)到C...
- ››轻量级开发的成功秘诀,第 4 部分: 轻量级容器的比...
- ››轻量级开发的成功秘诀,第 5 部分: 在保守公司进行...
- ››轻量级开发的成功秘诀,第 6 部分: 持久性策略
- ››轻量级开发的成功秘诀,第 7 部分: Java 替代方案...
- ››轻量级开发的成功秘诀,第 8 部分: Seaside
更多精彩
赞助商链接