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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3279-[SCOI2013]密码【Manacher】

正题 题目链接:https://www.luogu.org/problemnew/show/P3279 题目大意 一个字符串满足: 有nnn个字符仅包含小写字母告诉你每个字符为中心的最大回文串长度告诉你每个两个字符的间隙为中心的最大回文串长度 求满足要求的字典序最小的字符串。 解题思路 因为字典序最小&…

Actor-ES框架:Ray

并发1. 并发和并行并发&#xff1a;两个或多个任务在同一时间段内运行。关注点在任务分割。并行&#xff1a;两个或多个任务在同一时刻同时运行。关注点在同时执行。本文大多数情况下不会严格区分这两个概念&#xff0c;默认并发就是指并行机制下的并发。2. 好处随着多核处理器…

Sentinel(十五)之在生产环境中使用 Sentinel

转载自 在生产环境中使用 Sentinel 引言 Sentinel 目前已可用于生产环境&#xff0c;除了阿里巴巴以外&#xff0c;也有很多企业在生产环境中广泛使用 Sentinel。 生产环境的 Sentinel Dashboard 需要具备下面几个特性: 规则管理及推送&#xff0c;集中管理和推送规则。se…

P3934-Nephren Ruq Insania【欧拉定理,树状数组】

正题 题目链接:https://www.luogu.org/problemnew/show/P3934 题目大意 长度为nnn的序列aaa 1lrw:1\ l\ r\ w:1 l r w:让l∼rl\sim rl∼r这个区间增加www。2lrp:2\ l\ r\ p:2 l r p:求alal1al2...%pa_l^{a_{l1}^{a_{l2}^{...}}}\% palal1al2...​​​%p直到ara_rar​ 解题思路…

Entity Framework Core 懒加载

众所周知在EF 6 及以前的版本中&#xff0c;是支持懒加载&#xff08;Lazy Loading&#xff09;的&#xff0c;可惜在EF Core 并不支持&#xff0c;必须使用Include方法来支持导航属性的数据加载。不过现在EF Core的开发团队打算恢复对这一功能的支持&#xff08;目前还未发布&…

Sentinel(十六)之AHAS Sentinel 控制台

转载自 AHAS Sentinel 控制台 AHAS Sentinel 是 Sentinel 的阿里云上版本&#xff0c;提供企业级的高可用防护服务&#xff0c;包括&#xff1a; 可靠的实时监控和历史秒级监控数据查询&#xff0c;包含 QPS、RT、load、CPU 使用率等指标&#xff0c;支持按照调用类型分类&a…

和各路巨佬の随机挑战3总结

第三次挑战\huge \texttt{\color{purple}第\color{blue}三\color{green}次\color{block}挑\color{red}战}第三次挑战 规则 随机挑取一蓝一紫一黑来做&#xff0c;拥有两次换题机会&#xff0c;若黑题是暂未学过的算法可以拥有无限次换题机会。 van♂van♂van♂成记录 过程 晚…

浅析Entity Framework Core2.0的日志记录与动态查询条件

一、 Entity Framework Core2.0的日志记录早在Entity Framework Core1.0 ,我们就使用相关的ILoggerProvider ILogger 这些基础接口类.来实现过日志记录.在Entity Framework Core2.0 估计是为了配合ASP.NET Core的日志.所以对这些接口进行了更进一步的包装,也弃用了一些接口和类…

Sentinel(十七)之启动配置项

转载自 启动配置项 配置方式 Sentinel 提供如下的配置方式&#xff1a; JVM -D 参数方式properties 文件方式&#xff08;1.7.0 版本开始支持&#xff09; 其中&#xff0c;project.name 参数只能通过 JVM -D 参数方式配置&#xff08;since 1.8.0 取消该限制&#xff09;&…

jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】

正题 题目大意 两个字符串A,BA,BA,B。可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串&#xff0c;求kkk的最大值。 解题思路 先将AAA和BBB字符串hashhashhash&#xff0c;然后枚举BBB作为子串的起始位置&#xff0c;然后二分出不修改字符的第一个不相等处xxx…

Actor-ES框架:Ray--事件(Event)编写说明

Event作用&#xff1a;存储事件数据。IEventBaseK&#xff1a;是Actor的StateId的类型&#xff0c;可以是long、可以是string&#xff0c;Ray一般使用OGuid生成的字符串作为主键。编写Event继承IEventBase接口&#xff0c;Base部分如下&#xff1a; public string Id {…

Sentinel(十八)之注解支持

转载自 注解支持 Sentinel 提供了 SentinelResource 注解用于定义资源&#xff0c;并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException等。使用 Sentinel Annotation AspectJ Extension 的时候需要引入以下依赖&#xff1a; <dependency><groupId>c…

jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】

正题 题目大意 一棵树&#xff0c;对于每个点&#xff0c;求从任何一个在该点的子树为头&#xff0c;以该点为结尾的序列必须选择这个点的最长不降子序列。 解题思路 首先我们使用权值线段树计算答案每个点(l,r,w)(l,r,w)(l,r,w)表示以l∼rl\sim rl∼r为结尾最长的不降升子序…

设计模式之策略模式在地铁票价系统中的应用

引言设计模式是面向对象编程的一个非常精彩的部分。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性&#xff0c;它能帮助我们将应用组织成容易了解&#xff0c;容易维护&#xff0c;具有弹性的架构。本文通过一个简单的案例来讲述策略模式在地铁票价系…

jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】

正题 题目大意 有nnn堆石子&#xff0c;每次选择一个区间博弈&#xff0c;先手必须先取最右边的石子堆。 每次询问(r,a,b)(r,a,b)(r,a,b)表示在a∼ba\sim ba∼b中选择一个数lll。要求使用l∼rl\sim rl∼r这个区间的石子进行博弈&#xff0c;然后若先手必胜输出最右边的石子需…

Sentinel(十九)之主流框架的适配

转载自 主流框架的适配 注&#xff1a;适配模块仅提供相应适配功能&#xff0c;若希望接入 Sentinel 控制台&#xff0c;请务必参考 Sentinel 控制台文档。 云原生微服务体系 Spring Cloud Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。Sentinel 与 Spring …

利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

【先上一张效果图】&#xff1a;一、原理&#xff1a;其实原理很简单&#xff1a;1.手机投屏到电脑&#xff1b;2.截取投屏画面的题目部分&#xff0c;进行识别&#xff0c;得到题目和三个答案&#xff1b;3.将答案按照一定的算法&#xff0c;进行搜索&#xff0c;得出推荐答案…

Sentinel(二十)之Envoy RLS Token Server

转载自 Envoy RLS Token Server Sentinel 提供了一个 Envoy Global Rate Limiting gRPC Service 的实现 sentinel-cluster-server-envoy-rls&#xff0c;借助集群限流 token server 来为 Envoy 服务网格提供集群流量控制的能力。 Note: You can refer to here for the Englis…

欢乐纪中某A组赛【2019.7.9】

前言 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 心态大崩 ZYCdalaoZYCdalaoZYCdalao去AKBAK\ BAK B组了所以应该是我垫…

g4e基础篇#5 创建分支和保存代码

使用版本控制系统最常见的工作流程就是修改代码&#xff0c;保存代码&#xff0c;共享代码。Git提供了一个简单的3步工作流&#xff0c;让你方便的完成这些操作。1. 新建工作分支2. 提交更改3. 推送分支到中心存储库与团队成员共享Git 工作流按照以上3步操作&#xff0c;我们就…