标签:vax 除了 absolute hide title important label today cep
https://github.com/yuzd/Autofac.Annotation/wiki
自己new一个对象不能实现拦截器功能,必须得从DI容器拿到的对象才能具备拦截器功能 可以参考 我写的文章介绍
用了Castle.Core组件 把你想要实现拦截器的目标类生成一个代理类。 然后织入拦截器,有2种方式
在你想要实现拦截的目标类上打上 【Aspect】标签,如上面的解释,Aspect标签可以根据InterceptorType属性值设定你是哪种方式的拦截器
InterceptorType属性 | 解释 |
---|---|
Class | 使用class的虚方法模式 【默认方式】 |
Interface | 使用接口模式 |
使得我们自定义的方法能够
拦截器标签 | 拦截器类型 | 使用说明 |
---|---|---|
AspectBeforeAttribute(抽象标签类) | 前置拦截器 | 重写Before方法 |
AspectAfterAttribute(抽象标签类) | 后置拦截器 | 重写After方法 |
AspectAroundAttribute(抽象标签类) | 前置+后置拦截器 | 重写Before和重写After方法 |
PointcutAttribute(抽象标签类) | 环绕拦截器 | 重写OnInvocation方法 |
名称 | 说明 |
---|---|
ComponentContext | DI容器,可以从中取得你已注册的实例 |
InvocationContext | 执行上下文,例如被拦截的MethodInfo ,Name, Parameters,ReturnType等 |
Exception | 异常信息,这个在前置拦截器是肯定为null,在后置拦截器中如果被拦截的方法出现了异常就能通过这个字段拿到异常信息 |
Exception说明
前置拦截器若抛了没有被catch住的异常
1. 然后在被拦截方法的所在类上打上 【Aspect】标签;
2. 被拦截方法上打上 【TestHelloBefor】标签
3. 被拦截方法需要有 virtual 关键字
前置拦截器方法的执行顺序为:先执行 TestHelloBefor的Before方法再执行你的Say方法
1. 然后在被拦截方法的所在类上打上 【Aspect】标签;
2. 被拦截方法上打上 【TestHelloAfter】标签
3. 被拦截方法需要有 virtual 关键字
后置拦截器方法的执行顺序为:先执行你的SayAfter方法再执行 TestHelloAfter的After方法
1. 然后在被拦截方法的所在类上打上 【Aspect】标签;
2. 被拦截方法上打上 【TestHelloArround】标签
3. 被拦截方法需要有 virtual 关键字
方法的执行顺序为:
注意:OnInvocation方法除了AspectContext参数以外 还有一个 AspectDelegate _next 参数, 如果只有一个环绕拦截器的话,那么这个参数就是被拦截方法的本体, 如果有多个环绕拦截器的话,那么最后一个就是被拦截方法的本体。
1. 然后在被拦截方法的所在类上打上 【Aspect】标签;
2. 被拦截方法上打上 【TransactionInterceptor】标签
3. 被拦截方法需要有 virtual 关键字
方法的执行顺序为:
如果有多个环绕拦截器的话,如下图:
如上图 代码的执行顺序为:
标签:vax 除了 absolute hide title important label today cep
原文地址:https://www.cnblogs.com/yudongdong/p/11747235.html