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

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

 2010-01-08 00:00:00 来源:WEB开发网   
核心提示: 对于第三步的类继承,很显然,轻量级AOP框架-移植python的装饰器(Decorator)到C#(编码篇)(2),这首先要具备一个条件,那就是原始类是可继承的,为了方便,我们也定义一个DecoratorContexe来取代上篇中的直接传入Wrapper方法的委托对象,否则,也无从谈起TestC

对于第三步的类继承,很显然,这首先要具备一个条件,那就是原始类是可继承的,否则,也无从谈起TestClassWrapper的生成,如果满足条件,那么可以使用反射创建动态类。同时,在c#中,我们需要创建一个动态程序集来容纳这些动态类。

对于第四步,系统需要重写欲处理的方法,要达到这个目标,我们只能请出我们的终极大神MSIL了,在C#中,可以使用Emit的方式进行IL嵌入编程,虽然麻烦了点,但这总算也能高效的解决问题。

对于第五步,一般来说,可以调用Activator.CreateInstance方法来创建对象,然而,在本人的另一篇博客《探究.net对象的创建, 质疑《再谈Activator.CreateInstance(Type type)方法创建对象和Expression Tree创建对象性能的比较》中,我们可以了解到Activator.CreateInstance并不是最高效的做法,因此,框架将考虑使用更高效的方式,如Emit或者ExpressionTree的方式生成委托并构造对象。

四. 具体编码

在编码前,为了方便快速的构造框架,个人将一些成熟的代码放入框架中,以提高效率,这部分代码主要有:FastReflection,可以通过Emit快速构造方法调用委托,CodeGenerator,Nbear框架中的一个IL编程帮助类,通过它可以让我们简化不少IL操作。

现在万事俱备,我们开始一步步的创造框架吧,首先定义DecoratorFilter接口,以方便扩展Attribute,同时,为了方便,我们也定义一个DecoratorContexe来取代上篇中的直接传入Wrapper方法的委托对象,DecoratorFilter接口定义如下:

01     public interface IDecoratorFilter {
02         Func<object, object[], object> Execute(DecoratorContext context);
03 }
04     其中的DecoratorContext类包含了欲封装方法的基本属性,其定义如下:
05     public sealed class DecoratorContext {
06         /// <summary>
07         /// 该方法通用调用委托
08         /// </summary>
09         public Func<object, object[], object> Invoker { get; private set; }
10  
11         /// <summary>
12         /// this对象
13         /// </summary>
14         public object Instanse { get; private set; }
15  
16         /// <summary>
17         /// 方法参数列表
18         /// </summary>
19         public object[] Parameters { get; private set; }
20  
21         public DecoratorContext(Func<object, object[], object> invoker, object instanse, object[] parameters) {
22             Invoker = invoker;
23             Instanse = instanse;
24             Parameters = parameters;
25         }
26     }

上一页  1 2 3 4 5 6  下一页

Tags:轻量级 AOP 框架

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接