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

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

什么是AOP?

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

有点深奥, 举个栗子image

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

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

 

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

image

 

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

  • 使用预处理器(如 C++ 中的预处理器)添加源代码。
  • 使用后处理器在编译后的二进制代码上添加指令。
  • 使用特殊编译器在编译时添加代码。
  • 在运行时使用代码拦截器拦截执行并添加所需的代码。

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

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

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

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

    dotnet 框架代表: 

public class CustomInterceptor : AbstractInterceptor     {         public async override Task Invoke(AspectContext context, AspectDelegate next)         {             try             {                 Console.WriteLine("Before service call");                 await next(context);             }             catch (Exception)             {                 Console.WriteLine("Service threw an exception!");                 throw;             }             finally             {                 Console.WriteLine("After service call");             }         }     }
复制代码

 

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

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

开始AspcetCore的表演

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

PM>   Install-Package AspectCore.Extensions.DependencyInjection

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

复制代码
public override async Task Invoke(AspectContext context, AspectDelegate next)         {             var logger = context.ServiceProvider.GetService<ILogger<AuthenticateInterceptor>>();             try             {                 var apiRequest = (ApiRequest) context.Parameters.FirstOrDefault();                 if (apiRequest == 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信