首页 / 软件开发 / .NET编程技术 / Enterprise Library Policy Injection Application Block之四
Enterprise Library Policy Injection Application Block之四2010-09-10 cnblogs artech一、为什么CallHandler需要进行排序PIAB为我们提供了一个很好地实现AOP的方式。AOP旨在实现Business Logic和Non-Business Infrastructure Logic的分离。通过PIAB,我们将这些业务无关的逻辑定义在一个个的CallHandler中,然后通过Attribute或者Configuration的方式,将我们所需的CallHandler运用到相应的目标对象中。从这个意义上讲,PIAB具有很好的Flexibility和Extensibility。但是,就我看来PIAB也具有一些不足之处,其最大的局限性在于:不能控制运用到某个Method的多个方法的执行顺序。而让CallHandler按照我们希望的顺序进行调用是非常有必要的。举个例子,假设我们将以下3个CallHandler运用到某个方法中:ValidationHandler:用于参数参数的验证,比如是否为null, string的Length是否超出长度等等。TransactionEnlistHandler: 用于将操作自动纳入到一个Transaction中,从而保证数据的一致性。AuditLoggingHandler:当时操作成功执行后进行Audit Log。很显然,正常的执行顺序应该是这样的:在最开始调用ValidationHandler进行参数的验证;Audit Log需要和目标方法一起纳入同一个Transaction中,所以TransactionEnlistHandler的调用紧随其后,最后才是AuditLoggingHandler。Microsoft提供的原生的PIAB是无法实现的,好在Enterprise Library是开源的,我们可以修改PIAB的Source Code来使其实现我们的目标。而仅仅是一个很小的改动。接下来我们就来讨论一下如何来实现可被排序的CallHandler Pipeline。二、如何创建Sequential CallHandler Pipeline如果要了解我们这个Sequential CallHandler Pipeline的实现,需要对PIAB的是实现机制有一定的了解。在本系列的第二部分里,我对PIAB的实现机制进行了详细的阐述,在这里我仅仅简单介绍一个PIAB是如何实现AOP的。PIAB对AOP的实现原理可以用一个词来概括:Method Interception。具体的做法做法是:通过PIAB Factory创建基于Target Type的Real Proxy,然后通过这个Real Proxy创建Transparent Proxy,并通过该Transparent Proxy调用Target Instance。在创建Real Proxy中,将运用到该Type的所有CallHandler缓存起来。当进行调用的时候,Transparent Proxy调用Real Proxy的Invoke方法。在该方法中,在将运用到当前Method的CallHandler构成一个Handler Pipeline。在真正调用Target Instance之前,按照Pipeline的先后顺序依次调用每个CallHandler。而我们实现的切入点就是:在CallHandler Pipeline创建之后,再根据我们希望的顺序将所有的CallHander重新排序。