【Autofac打标签模式】Aspect拦截器

【 Autofac打标签模式】开源DI框架扩展地址:

https://github.com/yuzd/Autofac.Annotation/wiki

 

前提条件

自己new一个对象不能实现拦截器功能,必须得从DI容器拿到的对象才能具备拦截器功能 可以参考 我写的文章介绍

拦截器原理简单介绍

用了Castle.Core组件 把你想要实现拦截器的目标类生成一个代理类。 然后织入拦截器,有2种方式

class + 方法为virtual的方式

这种方式需要 从容器中是根据一个classType来获取到目标实例

interface + 方法重写的方式

这种方式需要 从容器中是根据一个interfaceType来获取到目标实例

拦截器开关

在你想要实现拦截的目标类上打上 【Aspect】标签,如上面的解释,Aspect标签可以根据InterceptorType属性值设定你是哪种方式的拦截器

InterceptorType属性 解释
Class   使用class的虚方法模式 【默认方式】  
Interface   使用接口模式  
目的是打个标签就能够拦截目标方法

使得我们自定义的方法能够

在指定的目标方法执行之前先执行(比如参数校验)

或者在指定的目标方法执行之后执行(比如说检验返回值,或其他收尾工作)

或者环绕目标的方法,比如事务:TransactionScope或者记录方法执行的时间

拦截器标签 拦截器类型 使用说明
AspectBeforeAttribute(抽象标签类)   前置拦截器   重写Before方法  
AspectAfterAttribute(抽象标签类)   后置拦截器   重写After方法  
AspectAroundAttribute(抽象标签类)   前置+后置拦截器   重写Before和重写After方法  
PointcutAttribute(抽象标签类)   环绕拦截器   重写OnInvocation方法  
拦截器的方法参数 AspectContext 属性说明 名称 说明
ComponentContext   DI容器,可以从中取得你已注册的实例  
InvocationContext   执行上下文,例如被拦截的MethodInfo ,Name, Parameters,ReturnType等  
Exception   异常信息,这个在前置拦截器是肯定为null,在后置拦截器中如果被拦截的方法出现了异常就能通过这个字段拿到异常信息  

Exception说明

前置拦截器若抛了没有被catch住的异常

如果有后置拦截器,可以在AspectContext的Exception字段获取。

如果没有后置拦截器则抛出

前置拦截器

首先要自己写一个类继承 前置拦截器AspectBeforeAttribute(抽象标签类)

实现该抽象类的Before方法

1. 然后在被拦截方法的所在类上打上 【Aspect】标签;

2. 被拦截方法上打上 【TestHelloBefor】标签

3. 被拦截方法需要有 virtual 关键字

前置拦截器方法的执行顺序为:先执行 TestHelloBefor的Before方法再执行你的Say方法

后置拦截器

首先要自己写一个类继承后置拦截器AspectAfterAttribute(抽象标签类)

实现该抽象类的After方法

1. 然后在被拦截方法的所在类上打上 【Aspect】标签;

2. 被拦截方法上打上 【TestHelloAfter】标签

3. 被拦截方法需要有 virtual 关键字

后置拦截器方法的执行顺序为:先执行你的SayAfter方法再执行 TestHelloAfter的After方法

前置+后置拦截器

首先要自己写一个类继承拦截器AspectAroundAttribute(抽象标签类)

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

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