Posted on 2007-01-14 17:04
canonical 阅读(1086)
评论(2) 编辑 收藏 所属分类:
设计理论
目前的AOP(Aspect Oriented Programming)技术虽然以动态代码织入为核心,但是这种织入仍然是一次性的。一般在系统构造的时候(例如ClassLoader装载Class的时候)实现类和成员函数的增强。此后在运行时刻代码结构是固定的而不再发生变化。但是在真正的业务处理过程中,我们在不同的应用场景下可能要求织入不同的Aspect。例如基本的权限Aspect, 如果在不同的应用场景有不同的权限设定,则我们显然希望进入一个确定的操作场景的时候就指定一整套的权限策略,而不是在每个函数调用时刻写上一大堆的if/else(这种分离的条件判断正是AOP试图从结构上消除的)。
为了实现AOP的二级动态化,我们首先需要约定一些公共标记(坐标),便于在标记处插入Aspect Container, 其次我们需要在系统中建立一个隐蔽的信道,可以通过该信道传递一个标志符(Aspect的id),用于在各处选择特定的Aspect. 建立这种动态特性之后,我们就可以据此发展出Aspect组的概念,并实现Aspect组之间的继承关系等高阶结构,从而最大限度的限制程序结构的分散化。
Witrix平台的BizFlow设计在概念上可以看作是AOP的一种二级动态化织入设计,它通过$bizId这一特定参数来选择织入的Biz。一个BizFlow对象是一组Biz(Aspect)的集合, BizFlow可以通过extends机制实现集合之间的合并等(BizFlow实现的合并策略其实是非常复杂的)。一个简单的应用就是流程支持,例如一个普通的实体对象对应的bizflow只需要加上如下代码即可获得流程相关的代码,前台菜单等。
<bizflow extends="testflow.biz.xml">