聊聊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.ForNamespace("AspectCoreDemo.*")); //拦截所有AspectCoreDemo及其子命名空间下面的接口或类});

有问题反馈

如果您有任何问题,请提交 Issue 给我们。
Github : https://github.com/dotnetcore/AspectCore-Framework
AspectCore QQ群: 306531723

原文:http://www.cnblogs.com/liuhaoyang/p/interceptor-in-aspectcore-part-1.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

你可能不知道的.Net Core Configuration

执行原理1. 配置读取顺序&#xff1a;与代码先后顺序一致。public Startup(IHostingEnvironment env){var builder new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json", false, true).AddJsonFile("cussettings.jso…

Dubbo(一)之简介

转载自 Dubbo 2.7入门 一、背景 本文介绍了网站应用的演进 随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;亟需一个治理系统确保架构有条不紊的演进。 单一…

Dubbo(二)之SpringBoot nacos集成

一、框架 使用springboot启动&#xff0c;注册中心现在naocs。 nacos安装 二、样例项目 &#xff08;1&#xff09;maven设置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId> <…

ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

在上文中&#xff0c;我们讨论了事件处理器中对象生命周期的问题&#xff0c;在进入新的讨论之前&#xff0c;首先让我们总结一下&#xff0c;我们已经实现了哪些内容。下面的类图描述了我们已经实现的组件及其之间的关系&#xff0c;貌似系统已经变得越来越复杂了。其中绿色的…

浅谈开发模式及架构发展

一、传统开发模式传统的开发模式基本一般是重服务端的开发方式&#xff0c;大部分工作都在服务端执行&#xff0c;然后返回到客户端&#xff08;通常是HTML&#xff09;。以Asp.net MVC为例&#xff0c;如下图&#xff1a;#1 根据请求的路由定位到对应的Controller的对应的Acti…

Dubbo(四)之xml配置方式

转载自 Dubbo xml配置方式 以 XML 配置的方式来配置你的 Dubbo 应用 有关 XML 的详细配置项&#xff0c;请参见&#xff1a;配置参考手册。如果不想使用 Spring 配置&#xff0c;而希望通过 API 的方式进行调用&#xff0c;请参见&#xff1a;API配置。想知道如何使用配置&a…

Actor-ES框架:Ray-Handler之CoreHandler编写

如图右上角所示&#xff0c;Ray中有两类Handler&#xff08;SubHandler和PartSubHandler&#xff09;,在使用中&#xff0c;SubHandler派生Actor的CoreHandler&#xff0c;PartSubHandler派生SQLToReadHandler&#xff0c;SQLToReadHandler派生Actor的ToReadHandler&#xff0c…

Dubbo(五)之动态配置中心

转载自 Dubbo动态配置中心 Dubbo 2.7 中的动态配置中心 配置中心&#xff08;v2.7.0&#xff09;在 Dubbo 中承担两个职责&#xff1a; 外部化配置。启动配置的集中式存储 &#xff08;简单理解为 dubbo.properties 的外部化存储&#xff09;。服务治理。服务治理规则的存储…

使用Mono将C#编译运行至WebAssembly平台

因为所有的主流网页浏览器都支持WebAssembly&#xff0c;开发者们现在可以寻找一个新的平台来部署他们的应用程序。由WebAssembly团队提供的标准工具链仅能将C、C编译成为WebAssembly&#xff0c;然而这对使用其他编程语言的开发者们并没有什么帮助。C#开发者就幸运的多了&…

Dubbo(六)之属性配置

转载自 Dubbo属性配置 属性配置 以属性配置的方式来配置你的 Dubbo 应用 如果你的应用足够简单&#xff0c;例如&#xff0c;不需要多注册中心或多协议&#xff0c;并且需要在spring容器中共享配置&#xff0c;那么&#xff0c;我们可以直接使用 dubbo.properties 作为默认…

使用Docker分分钟启动常用应用

前言Docker是目前比较火的一个概念&#xff0c;同时也是微服务中比较关键的一个容器化技术。但是&#xff0c;单从理论上好难看出Docker的优势&#xff0c;因此&#xff0c;我希望在这篇文章中提供一些Docker的使用示例&#xff0c;希望从实际应用上帮助大家理解Docker的优势&a…

nssl1337-矩形统计【单调栈】

正题 题目大意 一个n∗nn*nn∗n的矩阵&#xff0c;然后有些位置破损。求可以剪出多少个不破损的矩形。 解题思路 预处理upi,jup_{i,j}upi,j​表示从(i,j)(i,j)(i,j)向上多少格子都是非破损格子。 然后我们枚举下界LowLowLow&#xff0c;将图像变成一个下部平整的条形图&…

TypeScript 2.7 版本发布

TypeScript 2.7版本已经发布了&#xff0c;新增了几个主要功能特性并进行了一些bug的修正。其中一些亮点包括对类属性的赋值检查、固定长度的元组和改进对象文字的类型推断。总的来说&#xff0c;这个版本对类型系统、ES2015特性和总体的TypeScript开发者体验都进行了改进优化。…

Azure Functions + Azure Batch实现MP3音频转码方案

客户需求客户的环境是一个网络音乐播放系统&#xff0c;根据网络情况提供给手机用户收听各种码率的MP3歌曲&#xff0c;在客户没购买歌曲的情况下提供一个三十秒内的试听版本。这样一个系统非常明确地一个需求就是会定期需要将一批从音乐版商手中获取到的高比特率音乐文件转换成…

Springboot Mybatis多数据源配置MybatisProperties坑

一、场景复现 配置了两个数据源&#xff0c;查询Dao却报错表不存在。 &#xff08;1&#xff09;maven <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> …

dotnet core webapi +vue 搭建前后端完全分离web架构(一)

架构服务端采用 dotnet core webapi前端采用: Vue router elementUIaxios问题使用前后端完全分离的架构&#xff0c;首先遇到的问题肯定是跨域访问。前后端可能不在同个server上&#xff0c;即使前后端处在同个server上&#xff0c;由于前后端完全分离&#xff0c;前后端使用…

SpringBoot使用日志

转载自 SpringBoot使用日志 1、选什么日志框架 首先列举一下日志门面和实现SpringBoot默认选用SLF4J和Logback日志级别&#xff1a;springboot默认已经帮我们配置好了日志&#xff0c;日志级别为trace<debug<info<warn<error默认的日志级别为inifo&#xff0c;日…

Dotnet Core Windows Service

在dotnet 中有topshelf 可以很方便的写windows 服务并且安装也是很方便的&#xff0c;命令行 运行.exe install 就直接把exe 程序安装成windows 服务。当然代码也要做相应的修改&#xff0c;具体的可以参照例子。在dotnet core 2.0 中 我们也有一个很方便的dll 来使用 https://…

Dubbo(十)之配置加载流程

转载自 Dubbo配置加载流程 Dubbo 中的配置加载流程介绍 此篇文档主要讲在应用启动阶段&#xff0c;Dubbo框架如何将所需要的配置采集起来&#xff08;包括应用配置、注册中心配置、服务配置等&#xff09;&#xff0c;以完成服务的暴露和引用流程。 根据驱动方式的不同&…

.NET 文档数据库 RavenDB 4.0 发布

RavenDB 还有一个新的版本&#xff0c;RavenDB 4.0.0&#xff0c;一个ACID文档数据库&#xff0c;为数据操作中的高性能业务提供完全事务性的开源NoSQL解决方案。新版本更新了许多关键功能。平台Windows x64Windows x86Ubuntu 16.04 x64树莓派Docker&#xff08;Ubuntu 16.04和…