技术开发 频道

用.NET实现AOP框架


【IT168 专稿】

前言

    尽管同时遭受众多正反两方面的评价,但采用AOP(Aspect-oriented Programming)技术开发的应用框架无论在.NET阵营还是Java阵营都越来越普遍的情况。从微软在MTS和COM+中引入声明方式(Declarative)的编码技术开始,通过元数据层次扩展对象能力似乎成为很多应用框架同时解决使用复杂性和功能丰富性矛盾的有效手段之一,毕竟虽然通过设计模式等技巧可以尽量避免类泛滥的情况,但编码上还是不如打个标签(.NET Attribute / Java Annotation)方便。

    AOP开发为各种应用逻辑之外的控制和管理机制以横切方式“楔入”控制流程提供便利,以COM+为例Role-Based Security、事务性、同步处理、上下文等很多机制的扩展可以在Attribute层次完成。虽然实现AOP本身可以通过Attribute之外的很多方式完成,但随着开发语言的演进,在.NET和Java开发中Attribute仍是一个不错的方式。

   不过实现AOP本身不仅限于Attribute的开发,为了通用并提高处理效率,根据.NET平台的特点,还需要完成很多配套机制:  
    Dynamic Proxies :动态代理,代理类的作用是在目标类型的外部增加一个壳,它本质上是一个丰富了之后的目标对象;
Dynamic MSIL Generator :对于高级AOP框架,为了能适应大多数类型的要求,最灵活同时也是难度最高的部分就是动态生成MSIL,实现一个“落实了”之后的代理类型;
Cache & Assembly Generation :为了提高执行速度,最好把动态生成的新类型缓冲到内存,同时为相应的Assembly提供面向I/O的保存和加载能力;
Custom Class Loader :定制类型加载过程,而不仅仅是直接对目标类型new();
Semantic Attribute:语义属性,扩展外部控制的语义属性,例如:安全、授权、访问控制、日志、性能监控等;

原始的实现

    在介绍一个相对完成的AOP实现之前,我们先看看如何用Attribute和专用自定义接口实现一个原始的、但控制逻辑“站在业务对象之外”的框架。

    在Builder模式中,我们通常用一个Director对象定一BuildUp的过程、控制每个Build Step的次序,但一种更简洁的方式是把执行次序标注在Builder类型的Attribute上,这样实现过程如下:

    定义抽象的Builder类型:
C# 
// Builder 抽象行为定义
public interface IAttributedBuilder
{
IList<string> Log { get;} // 记录Builder 的执行情况
void BuildPartA();
void BuildPartB();
void BuildPartC();
}

public class AttributedBuilder : IAttributedBuilder
{
private IList<string> log = new List<string>();
public IList<string> Log { get { return log; } }

public void BuildPartA() { log.Add("a"); }
public void BuildPartB() { log.Add("b"); }
public void BuildPartC() { log.Add("c"); }
}

0
相关文章