Dora.Interception,为.NET Core度身打造的AOP框架 [3]:多样化拦截器应用方式

在《以约定的方式定义拦截器》中,我们通过对拦截器的介绍了Dora.Interception的两种拦截机制,即针对接口的“实例拦截”针对虚方法的“类型拦截”。我们介绍了拦截器的本质以及基于约定的拦截器定义方式,接下来我们将着重关注拦截器的应用问题。

一、拦截器应用解决什么问题

和有些AOP框架不同,Dora.Interception在设计刻意地将拦截器和拦截器应用刻意地分开。不仅如此,在拦截器和拦截器应用之间,我们还分离出“拦截器管道的构建”:

拦截器:旨在完成单一拦截功能的实现;

拦截器管道的构建:将多个拦截器按照指定的顺序构建一个管道;

拦截器的应用:将构建的拦截器管道应用到被拦截的某个方法上。

二、IInterceptorChainBuilder

拦截器管道的构建由IInterceptorChainBuilder来完成,它类似于ASP.NET Core的IApplicationBuilder接口,后者利用注册的中间件来构建一个中间件管道,而IInterceptorChainBuilder则采用类似的方式将注册的拦截器构建成一个拦截器管道。如下面的代码片段所示,我们利用Use方法将表示拦截器的InterceptorDelegate 的委托对象提供给IInterceptorChainBuilder,该方法的order参数表示提供的拦截器最终在拦截器链条上的位置。拦截器管道的构建最终由Build方法来完成,构建的管道也体现为一个InterceptorDelegate类型的委托。

public interface IInterceptorChainBuilder { InterceptorDelegate Build(); IInterceptorChainBuilder New(); IInterceptorChainBuilder Use(InterceptorDelegate interceptor, int order); IServiceProvider ServiceProvider { get; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsspz.html