技术开发 频道

用.NET实现AOP框架


   从上面的示例不难看出通过Remoting和MarshalByRefObject的组合,可以借助代理类把调用过程拦截,并“横切”的楔入额外的控制逻辑。但比较遗憾的是这种方式要把C#类型唯一一次继承机会让给MarshalByRefObject,侵入性过高。尽管有很多不足,不过在项目中采用该方法实现一个透明的装饰属性框架成本相对还算较低的。另外,上面的示例中并没有提供对params参数、对于属性方法和构造函数的支持,更为复杂的工程化实现可以参考Enterprise Library的Policy Injection代码块。

自定义代理拦截框架方式

    如果希望在.NET平台实现一个侵入性低的框架,则需要通过一些更复杂的、更“动态”的手段实现对待装饰对象的包装,概念上.NET Framework CLR实际执行的是底层MSIL,因此部分主流框架采用的是通过System..Reflection.Emit命名空间下的对象实现动态Assembly,采用该方式的主要意义是根据用户提供的类型实例,动态用MSIL装配出一个新的类型,而新的类型在执行具体方法、属性方法、委托和事件的同时,调用动态装配的外界方法(/方法列表)。


 首先,在执行前框架通过System.Reflection.Emit根据目标类型生成新的动态类型,生成动态类型的过程包括创建构造函数、创建方法、属性方法和事件,并且为外部“横切”机制提供入口;
 执行过程中,客户程序实际调用的是动态生成的新类型; 

      C# 定义实际执行其他方法的委托
public delegate object MethodCall(object target, MethodBase method, 
object[] parameters, DecoratorAttribute[] attributes);
     C# 定义各种装饰属性
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | 
AttributeTargets.Interface, Inherited = true)]
public abstract class DecoratorAttribute : Attribute
{
public abstract void Process(object target, MethodBase method, object[] parameters);
}

/// 代表执行前和执行后外部“横切”机制的抽象对象
public abstract class BeforeDecoratorAttribute : DecoratorAttribute { }
public abstract class AfterDecoratorAttribute : DecoratorAttribute { }
 
 
0
相关文章