国内开源社区巨作AspectCore-Framework入门

前些天和张队(善友),lemon(浩洋),斌哥(项斌)等MVP大咖一块儿吃饭,大家聊到了lemon名下的AOP这个项目,我这小白听得一脸懵逼,后面回来做了一下功课,查了下资料,在lemon的Github上把这个项目学习了一下,收获颇丰,让我这个没有接触过AOP的Coder叹为观止,陷入了对lemon的深深崇拜,在这里把学习的新的体会分享给大家.

什么是AOP?

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

有点深奥, 举个栗子640?wx_fmt=png

如果说之前做的一个系统专门给内部的服务提供接口的,因为是在内网中访问,所以就没有加上认证服务,现在这个系统要公开出来,同样的那套接口要给外部系统服务了,那么此时,就要进行认证,认证通过才能获取接口的数据.

传统的做法是,修改每一个接口.这样就会造成代码改动过大,很恐怖.

 

这个时候AOP就可以登场了,我们可以在这一类服务的前面,加上一个一系列上一刀,在切出来的裂缝里面插入认证方法.

640?wx_fmt=png

 

然而,怎么插入这个切面是关键.AOP 实现会采用一些常见方法:

  • 使用预处理器(如 C++ 中的预处理器)添加源代码。

  • 使用后处理器在编译后的二进制代码上添加指令。

  • 使用特殊编译器在编译时添加代码。

  • 在运行时使用代码拦截器拦截执行并添加所需的代码。

但是常见还是后处理和代码拦截两种方式

  • 后处理,或者叫 静态织入

    指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强或静态织入。

    在dotnet 中一般在编译时通过在MSBiuld执行自定义的Build Task来拦截编译过程,在生成的程序集里插入自己的IL。

    dotnet 框架代表: PostSharp

     

  • 代码拦截,或者叫 动态代理

    在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强或动态代理。

    在dotnet 中一般在运行时通过Emit技术生成动态程序集和动态代理类型从而对目标方法进行拦截。

    dotnet 框架代表: Castle DynamicProxy 和 AspectCore

引用https://github.com/dotnetcore/AspectCore-Framework/blob/master/docs/0.AOP%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D.md

AspectCore-Framework的代码拦截

我这里直接应用AOP Demo中的一段代码来说说这个拦截.

640?wx_fmt=png

代码中,其实执行到 await next(context)的时候,才会真正去调用那个被拦截的方法.

这样,我们就可以灵活地在代码调用前,调用后做我们想做的事情了.甚至可以把代码包在一个try…catch...中来捕获异常.

开始AspcetCore的表演

新建一个web应用程序后,从 Nuget 安装 AspectCore.Extensions.DependencyInjection 包.

PM>   Install-Package AspectCore.Extensions.DependencyInjection

然后.我们就可以来定义我们的拦截器了,我定义了一个这样的拦截器.

640?wx_fmt=png

当ApiRequest为空或者Name不等于admin的时候之家返回并记录未授权.

否则,调用该调用的方法并记录ApiRequest中的Message.

然后,我定义一个UserService.

640?wx_fmt=png

在Controler中调用注入UserServce并调用该Service.

640?wx_fmt=png

注册IUserservice并在ConfigureServices中配置创建代理类型的容器:

640?wx_fmt=png

需要注意的是红色背景处,默认的ConfigureService返回类型是空的,我们要修改成为返回类型是IServiceProvider.

1.全局拦截

我们在上面的ConfigureService配置的AuthenticateInterceptor默认情况下是全局的,即这里的IUserService它会拦截,当然如果新增了一个IRoleServce它也是会拦截的.

我把程序运行起来用PostMan访问Api进行测试.下图是Post的数据和返回结果.

640?wx_fmt=png

说明接口是正常工作的,成功地把传过去的Name原样返回.

那么拦截器有没有生效呢?我看看CMD的输出.

640?wx_fmt=png

如果我们修改一下Name不等于Admin,预期应该是返回空,并且日志打印出未授权,是不是这样呢?

640?wx_fmt=png

640?wx_fmt=png

完美,与预期完全相同.

可以发现,这正是我们在拦截器中所作的工作,说明拦截器对该UserService生效了.

2.作用于特定的Service或者Method的全局拦截器

如果我们不想对所有Servce或是Method都拦截,只拦截指定的Servce或者Method呢?

其实,我们是可以配置全局拦截器的作用域的.

services.AddDynamicProxy(config =>{                //支持通配符,只对IRole开头的Servce有效config.Interceptors.AddTyped<AuthenticateInterceptor>(Predicates.ForService("IRole*"));});

我用以上方法配置为该过滤器只对IRole开头的Servce有效,那么,当我们让问IUserServce时,该拦截器肯定是不会生效的,事实是不是这样呢?

640?wx_fmt=png

即使Name不是admin,结果也返回了,说明确实是没有生效的.

还可以用以下方法指定过滤器作用于的Method.

 

//支持通配符,只对Name结尾的方法有效config.Interceptors.AddTyped<AuthenticateInterceptor>(Predicates.ForMethod("*Name")); 

3.全局过滤器忽略配置

忽略配置有两种方法

一种是为Service或者Method打上[NonAspect] 标签,那个过滤器就不会对该处生效了.

public interface IUserService{[NonAspect]String GetUserName(ApiRequest req);}

此时,即使Name不等于Admin,也是有结果返回会的.

640?wx_fmt=png

说明此时配置器对GetUserName方法确实没有生效.

 

另外一种是 全局忽略配置,亦支持通配符:

640?wx_fmt=png

4.拦截器中的依赖注入

对拦截器中有get和set权限的属性标记[AspectCore.Injector.FromContainerAttribute]特性,即可自动注入该属性.

640?wx_fmt=png

也可以拦截器上下文AspectContext可以获取当前Scoped的ServiceProvider

利用该ServiceProvider来对依赖项赋值.

640?wx_fmt=png

本文只是对AsceptCore最简单的一套流程end to end 地进行了叙述,这还只是AsceptCore的冰山一角.在此向开发处如此牛逼AOP框架的小伙致敬!!

欢迎访问

https://github.com/dotnetcore/AspectCore-Framework/blob/master/docs/1.%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md

解锁更多新姿势!!! 

本博客Demo地址

https://github.com/liuzhenyulive/AspceptCoreDemo

AsceptCore地址

https://github.com/dotnetcore/AspectCore-Framework

相关文章:

  • AspectCore中的IoC容器和依赖注入

  • 使用AspectCore动态代理

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

  • .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制

原文地址: https://www.cnblogs.com/CoderAyu/p/9906349.html


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

640?wx_fmt=jpeg


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

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

相关文章

【数论】Product(P5221)

正题 P5221 题目大意 求 ∏i1n∏j1nlcm(i,j)gcd(i,j)\prod_{i1}^n\prod_{j1}^n\frac{lcm(i,j)}{gcd(i,j)}i1∏n​j1∏n​gcd(i,j)lcm(i,j)​ 解题思路 ∏i1n∏j1nlcm(i,j)gcd(i,j)\prod_{i1}^n\prod_{j1}^n\frac{lcm(i,j)}{gcd(i,j)}i1∏n​j1∏n​gcd(i,j)lcm(i,j)​ ∏i1n∏…

STL的可持久化数组

rope是一种可持久化数组&#xff0c;可持久化平衡树&#xff0c;采用块状链表实现 #include<ext/rope> using namespace __gnu_cxx; rope<int>a;rope就是一个用可持久化平衡树实现的“重型”string 库中模板计算基本和string一样简单 各种操作的复杂度都是O(log…

HarmonyOs4.0基础(一)

目录 一、HarmonyOs系统定义 1.1系统的技术特性(三大特征) 1.1.1、硬件互助、资源共享 1.1.2、一次开发、多端部署(面向开发者) 1.1.3、统一OS&#xff0c;弹性部署(支持多种API&#xff1a;ArkTs、JS、C/C、Java) 1.2、系统的技术架构 二、Harmony OS项目搭建 2.1、(D…

P4643-[国家集训队]阿狸和桃子的游戏【结论】

正题 题目链接:https://www.luogu.com.cn/problem/P4643 题目大意 给出nnn个点mmm条边的无向图&#xff0c;两个人轮流选择一个未被选择的点加入点集。 然后每个人的权值为选出的点的导出子图点权加边权和。 两个人都希望自己的权值减去对方的权值最大 求先手的权值减去后…

C. Code a Trie(Trie+dfs+贪心)

C. Code a Trie 大佬题解&#xff0c;代码基本就是抄的 对于每一个值计算所有串的LCA&#xff0c;也就是最长公共前缀&#xff0c;将该节点&#xff08;Trie树的节点&#xff09;标记&#xff0c;对于这些字符串在LCA下面的点一定不存在&#xff08;如果存在他们不会返回相同…

swagger文档转换为WebApiClient声明式代码

1 swagger简介Swagger是一个规范且完整的框架&#xff0c;提供描述、生产、消费和可视化RESTful Web Service。其核心是使用json来规范描述RESTful接口&#xff0c;另外有提供UI来查看接口说明&#xff0c;并有一套生成不同语言的客户端调用代码生成器。1.1 对Api提供者自顶向下…

Musical Theme pku1743 (后缀数组)

Musical Theme(后缀数组) 题意&#xff1a; n个数&#xff0c;选取一段子序列&#xff0c;满足以下条件&#xff1a; 1.长度至少为5 2.在数列中其他位置出现过(允许转置) 3.与其他位置出现的不重叠 转置&#xff1a;将恒定的正或负值添加到子序列上 例如&#xff1a; n个数为…

各种有用的东西留言板

目录各种链接各种OJ各种有用网站模拟赛排名表格制作其他STLO2优化&#xff1a;快读fread黑科技各种链接 各种OJ ssl 洛谷 纪中 牛客 PTA Vijos JoyOI 51Nod 大视野 ssl比赛 NOI.AC AcWing USACO CodeVS 北京大学 浙江大学 Comet OJ 杭州电子科技大学 《算法竞赛进阶指南》题库…

P3180-[HAOI2016]地图【圆方树,莫队,分块】

正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 nnn个点mmm条边的一个仙人掌&#xff0c;有点权。 QQQ次询问给出op,x,yop,x,yop,x,y&#xff0c;封闭111到xxx号点的所有简单路径后xxx能到达的点的点权中&#xff0c;小于yyy且出现次数为奇数/偶数的权值数目…

M. Monster Hunter(树形dp)

M. Monster Hunter 才知道原来树形dp是三维的&#xff0c;一直没有学会过&#xff0c;感谢大佬的文章&#xff01;算法进阶—理解树形背包问题 状态表示&#xff1a;fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}​以iii为根的子树&#xff0c;考虑到第kkk个儿子时&#xff0c;…

Another Blog

说明&#xff1a; 此博客用于平时做题 但为了整理知识&#xff0c;用博客园来存知识 博客园网址&#xff1a; https://www.cnblogs.com/ssllyf

KubeCon+CloudNativeCon首秀中国!

2018年11月13-15日&#xff0c;全球顶级的Kubernetes官方技术论坛KubeConCloudNativeCon将首次登陆中国&#xff0c;此次活动由云原生计算基金会&#xff08;CNCF&#xff09;主办&#xff0c;在上海跨国采购会展中心隆重举行。KubeCon CloudNativeConKubeConCloudNativeCon 是…

可持久化(一)

参考博客 可持久化数据结构&#xff1a;可以保留每一个历史版本&#xff0c;若所有版本都既可以访问又可以修改&#xff0c;成为完全可持久化&#xff08;可以回滚到某个历史版本&#xff09; 时间线&#xff1a; 可持久化线段树 可持久化下标线段树 题目&#xff1a; 模板…

【模板】高斯消元

ACM模板 目录高斯消元解线性方程组异或方程组bitset优化异或方程组高斯消元解线性方程组 int a[N][N]输入矩阵&#xff0c;nnn行&#xff0c;n1n1n1列&#xff0c;下标从0开始 第n1n1n1列表示方程右边的值&#xff08;n行即n个方程&#xff0c;n列即n个未知数&#xff09; int…

各种模板(数据结构图论)

文章目录数据结构LCT线段树线段树分治树状数组图论Tarjan静态仙人掌最小生成树最短路-Floyd最短路-Dijkstra最短路-Bellman-Ford最短路-SPFA数据结构 LCT #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll lo…

P6620-[省选联考2020A卷]组合数问题【组合数学,斯特林数】

正题 题目链接:https://www.luogu.com.cn/problem/P6620 题目大意 给出n,x,p,mn,x,p,mn,x,p,m和一个mmm次多项式fff求 ∑k0nf(k)xk(nk)\sum_{k0}^nf(k)\times x^k\times \binom{n}{k}k0∑n​f(k)xk(kn​) 答案对ppp取模。 1≤n≤109,1≤m≤10001\leq n\leq 10^9,1\leq m\leq …

ASP.NET Core中使用GraphQL - 第一章 Hello World

前言你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中&#xff0c;我将展示如何在ASP.NET Core中集成GraphQL, 并使用GraphQL作为你的API查询语言。…

L2-005 集合相似度 (25分)

L2-005 集合相似度 (25分) 给定两个整数集合&#xff0c;它们的相似度定义为&#xff1a;N​c/N​t​​ 100%。其中N​c 是两个集合都有的不相等整数的个数&#xff0c;N​t是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式&#xf…

【模板】EK求最大流、dinic求最大流

ACM模板 目录概念EK算法Dinic算法概念 yxc老师的部分总结 基本概念 1.1 流网络&#xff0c;不考虑反向边 1.2 可行流&#xff0c;不考虑反向边 1.2.1 两个条件&#xff1a;容量限制、流量守恒 1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量 1.2.3 最大流是指最大可行…

11月7日邀您参加成都微软MVP圆桌之夜!

阅读文本大概需要 3.3 分钟。活动背景/规模成都一座来了就不想离开的城市&#xff0c;在此秋高气爽的日子里&#xff0c;我们迎来了成都微软最有价值专家&#xff08;MVP&#xff09;圆桌之夜。在过去的一年中&#xff0c;感谢各位MVP以杰出的专业知识在技术社区中解决了大量的…