前言

在上一篇文章使用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动态代理中的拦截器详解(一)相关推荐

  1. 聊聊AspectCore动态代理中的拦截器(一)

    前言 在上一篇文章使用AspectCore动态代理中,简单说明了AspectCore.DynamicProxy的使用方式,由于介绍的比较浅显,也有不少同学留言询问拦截器的配置,那么在这篇文章中,我们来 ...

  2. structs2拦截器详解

    Struts2(XWork)提供的拦截器的功能说明: 拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 Chaining In ...

  3. SpringMVC拦截器详解

    SpringMVC之拦截器 拦截器概述 1.1什么是拦截器(HandleUbterceper) 拦截器可以在目标方法执行之前进行一些拦截工作,或者在目标方法执行过后进行一些操作.在javaWeb的学习 ...

  4. java参数action_Struts2之Action接收请求参数和拦截器详解

    技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的A ...

  5. 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   ...

  6. 第五章 处理器拦截器详解

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  7. ​​​​​​过滤器和拦截器详解

    过滤器 和 拦截器的 6个区别,别再傻傻分不清了_程序员小富的博客-CSDN博客_过滤器和拦截器 若依登陆过程及过滤器拦截器的使用: 用户登陆接口:1.把用户信息通过uuid即token作为key,存 ...

  8. Springboot过滤器和拦截器详解及使用场景

    一.过滤器和拦截器的区别 1.过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的.请求结束返回也是,是在servlet处理完后,返回给前端之前. 2.拦截 ...

  9. struts2 18拦截器详解(五)

    I18nInterceptor 该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了 ...

最新文章

  1. 《像计算机科学家一样思考Python(第2版)》——2.6 字符串操作
  2. KVM中virtio实现(九)
  3. ML之LiR:机器学习经典算法之线性回归算法LiR的简介、使用方法、经典案例之详细攻略
  4. (四) View/Model 全解(mvc)
  5. linux桌面添加软件快捷方式,如何在 Ubuntu 桌面手动添加应用快捷方式
  6. Qt 设置指定列数显示
  7. 使用 ssmtp 於 shell 透過 Gmail 寄信
  8. 曝微软将发布基于 Excel 的低代码语言:Power Fx
  9. 清华大学计算机期末试题,清华大学计算机系C++期末考试题及答案.doc
  10. 推荐系统应用---新闻资讯类
  11. asp毕业设计——基于asp+sqlserver的人力资源管理系统设计与实现(毕业论文+程序源码)——人力资源管理系统
  12. 小米4充不了电处理办法(图文)小米4不能充电的维修教程
  13. 城市规划计算机辅助设计综合实践,城市规划计算机辅助设计综合实践:AutoCAD2015/ArcGIS/PS/SU...
  14. 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
  15. bugku 杂项 图穷匕见 wp
  16. 51NOD - 1830路径交
  17. Jetpack Compose--声明式UI替代传统命令式UI的新产品
  18. 高效能管理之要事第一 时间管理表格
  19. 【Java学习】JDK安装及第一个java程序
  20. Java WEB开发须知知识点---基础篇

热门文章

  1. CentOS7.2 忘记root密码解决
  2. Facebook用户遭遇千年虫:瞬间有了46年老友
  3. 大数据量分页查询方法(转)
  4. 使用 python 的 urllib2和 urllib模块爆破 form 表单的简易脚本
  5. python 3.* + Eclipse mar.2 +pydev 5.0 环境搭建
  6. 新装机器如何修改IP地址
  7. 【bayes】贝叶斯likelihood和model
  8. Oracle RAC 修改 IP 地址
  9. ddr2和ddr3的区别
  10. 【Blog.Core开源】框架集成部门权限