AspectCore动态代理中的拦截器详解(一)
前言
在上一篇文章使用AspectCore动态代理中,简单说明了AspectCore.DynamicProxy的使用方式,由于介绍的比较浅显,也有不少同学留言询问拦截器的配置,那么在这篇文章中,我们来详细看一下AspectCore中的拦截器使用。
两种配置方式
在AspectCore中,提供拦截器的特性配置和全局配置两种使用方式,并且分别提供AbstractInterceptor
(可用于全局拦截器配置)和AbstractInterceptorAttribute
(可同时用于全局配置和特性配置)两个拦截器基类。下面来分别演示两个拦截器配置方式的使用:
特性拦截器。我们继承AbstractInterceptorAttribute来实现一个自己的特性拦截器
public class CustomInterceptorAttribute : AbstractInterceptorAttribute{ public override Task Invoke(AspectContext context, AspectDelegate next) { return context.Invoke(next);}}
那么此时CustomInterceptorAttribute
可以标记在需要拦截的接口,类或者方法上来开启拦截。
全局拦截器配置。我们继承AbstractInterceptor来实现一个自己的特性拦截器(除不能作为
Attribute
标记在口,类或者方法上之外,AbstractInterceptor和AbstractInterceptorAttribute并无任何区别)
public class CustomInterceptor : AbstractInterceptor{ public override Task Invoke(AspectContext context, AspectDelegate next){ return context.Invoke(next);}}
现在我们已经定义了我们自己的拦截器,我使用Microsoft.Extensions.DependencyInjection的集成方式来演示全局拦截器的配置(需安装AspectCore.Extensions.DependencyInjection
包):
IServiceCollection services = new ServiceCollection();
services.AddDynamicProxy(config =>
{config.Interceptors.AddTyped<CustomInterceptor>();
});
IServiceProvider serviceProvider = services.BuildAspectCoreServiceProvider();
CustomInterceptor便可以拦截由serviceProvider创建的任何服务的方法。
三种拦截器类型
在AspectCore中,提供了TypedInterceptor
,ServiceInterceptor
,DelegateInterceptor
三种拦截器的激活类型。
TypedInterceptor
标记在接口,类或者方法上的特性拦截器或者使用上面config.Interceptors.AddTyped<CustomInterceptor>();
配置的全局拦截器,这类拦截器对于每个方法具体唯一的实例。ServiceInterceptor
注册到DI并从DI激活使用的拦截器。这类拦截器的生命周期同注册到DI时的生命周期一致。如下面我们注册一个瞬态的ServiceInterceptor:
IServiceCollection services = new ServiceCollection();services.AddTransient<CustomInterceptor>();
我们可以使用ServiceInterceptor
特性激活注册到DI中的拦截器:
[ServiceInterceptor(typeof(CustomInterceptor))]public interface IService{ void Foo();
}
或者使用全局配置:
IServiceCollection services = new ServiceCollection();services.AddTransient<CustomInterceptor>();services.AddDynamicProxy(config =>{config.Interceptors.AddServiced<CustomInterceptor>();});IServiceProvider serviceProvider = services.BuildAspectCoreServiceProvider();
DelegateInterceptor
在使用全局的拦截器配置时,我们也可以不定义具体的拦截器类,而直接使用签名为Func<AspectDelegate, AspectDelegate>
或Func<AspectContext, AspectDelegate, Task>
的委托来执行拦截,如下面:
IServiceCollection services = new ServiceCollection();services.AddTransient<CustomInterceptor>();services.AddDynamicProxy(config =>
{config.Interceptors.AddDelegate( async (content, next) =>{Console.WriteLine("delegate interceptor"); await content.Invoke(next);});
});
IServiceProvider serviceProvider = services.BuildAspectCoreServiceProvider();
使用通配符或者委托配置拦截器
在AspectCore中配置全局拦截器时,可以使用通配符或者委托来限定拦截器的作用范围。
内置提供了Predicates.ForMethod
,Predicates.ForService
,Predicates.ForNameSpace
三个通配符函数:
services.AddDynamicProxy(config =>{config.Interceptors.AddTyped<CustomInterceptor>(Predicates.ForMethod("*Query")); //拦截所有Query后缀的方法config.Interceptors.AddTyped<CustomInterceptor>(Predicates.ForService("*Repository")); //拦截所有Repository后缀的类或接口config.Interceptors.AddTyped<CustomInterceptor>(Predicates.ForMethod("AspectCoreDemo.*")); //拦截所有AspectCoreDemo及其子命名空间下面的接口或类});
有问题反馈
如果您有任何问题,请提交 Issue 给我们。
Github : https://github.com/dotnetcore/AspectCore-Framework
AspectCore QQ群: 306531723
相关文章
Asp.Net Core轻量级Aop解决方案:AspectCore
AspectCore.Extension.Reflection : .NET Core反射扩展库
AspectCore中的IoC容器和依赖注入
使用AspectCore动态代理
原文:https://www.cnblogs.com/liuhaoyang/p/interceptor-in-aspectcore-part-1.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
AspectCore动态代理中的拦截器详解(一)相关推荐
- 聊聊AspectCore动态代理中的拦截器(一)
前言 在上一篇文章使用AspectCore动态代理中,简单说明了AspectCore.DynamicProxy的使用方式,由于介绍的比较浅显,也有不少同学留言询问拦截器的配置,那么在这篇文章中,我们来 ...
- structs2拦截器详解
Struts2(XWork)提供的拦截器的功能说明: 拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 Chaining In ...
- SpringMVC拦截器详解
SpringMVC之拦截器 拦截器概述 1.1什么是拦截器(HandleUbterceper) 拦截器可以在目标方法执行之前进行一些拦截工作,或者在目标方法执行过后进行一些操作.在javaWeb的学习 ...
- java参数action_Struts2之Action接收请求参数和拦截器详解
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的A ...
- 第五章 处理器拦截器详解——跟着开涛学SpringMVC
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- 第五章 处理器拦截器详解
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- 过滤器和拦截器详解
过滤器 和 拦截器的 6个区别,别再傻傻分不清了_程序员小富的博客-CSDN博客_过滤器和拦截器 若依登陆过程及过滤器拦截器的使用: 用户登陆接口:1.把用户信息通过uuid即token作为key,存 ...
- Springboot过滤器和拦截器详解及使用场景
一.过滤器和拦截器的区别 1.过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的.请求结束返回也是,是在servlet处理完后,返回给前端之前. 2.拦截 ...
- struts2 18拦截器详解(五)
I18nInterceptor 该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了 ...
最新文章
- 《像计算机科学家一样思考Python(第2版)》——2.6 字符串操作
- KVM中virtio实现(九)
- ML之LiR:机器学习经典算法之线性回归算法LiR的简介、使用方法、经典案例之详细攻略
- (四) View/Model 全解(mvc)
- linux桌面添加软件快捷方式,如何在 Ubuntu 桌面手动添加应用快捷方式
- Qt 设置指定列数显示
- 使用 ssmtp 於 shell 透過 Gmail 寄信
- 曝微软将发布基于 Excel 的低代码语言:Power Fx
- 清华大学计算机期末试题,清华大学计算机系C++期末考试题及答案.doc
- 推荐系统应用---新闻资讯类
- asp毕业设计——基于asp+sqlserver的人力资源管理系统设计与实现(毕业论文+程序源码)——人力资源管理系统
- 小米4充不了电处理办法(图文)小米4不能充电的维修教程
- 城市规划计算机辅助设计综合实践,城市规划计算机辅助设计综合实践:AutoCAD2015/ArcGIS/PS/SU...
- 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
- bugku 杂项 图穷匕见 wp
- 51NOD - 1830路径交
- Jetpack Compose--声明式UI替代传统命令式UI的新产品
- 高效能管理之要事第一 时间管理表格
- 【Java学习】JDK安装及第一个java程序
- Java WEB开发须知知识点---基础篇