WEB开发网
开发学院软件开发Python 轻量级AOP框架-移植python的装饰器(Decorator)到C... 阅读

轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)

 2010-01-08 00:00:00 来源:WEB开发网   
核心提示: 下面我们再次顺序的对上面例子的执行方式进行说明:首先,系统检查到函数Test有Decorator,轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)(3),因为是倒序处理,所以,该接口返回一个委托,然后,首先针对debugger,系统会直接执行debuggerWra

下面我们再次顺序的对上面例子的执行方式进行说明:

首先,系统检查到函数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 }

上一页  1 2 3 4  下一页

Tags:轻量级 AOP 框架

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接