翼度科技»论坛 编程开发 .net 查看内容

(系列七).net8 Aop切面编程

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。
    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。
    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。
友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。
有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我
什么是Aop切面编程
俗话说:没有使用Aop的系统都不是好系统。  
那么aop到底是什么东西,人们对它的评价如此之高。
Aop是Aspect Oriented Programming的缩写,意思是“面向切面编程”。
从字面意思上理解就是把一个功能块切成很多面。
列如:
我有10个获取数据的接口,随着代码的不断迭代,现如今想做以下2个操作。
1、现在对这10个接口做一个【性能监控】,监控这10个接口的调用时间。你会怎么做?
2、对这10个接口做一个【调用监控】,查看调用人、调用时间、传入参数、返回数据等记录。你会怎么做?
有人说,在每个接口中加一点监控代码。
也有人说,写一个监控方法,在接口中调用该方法。
但这都不是好的选择,它不仅工作量大、耦合性高,还容易造成错误,不易维护。
为了解决这种困难,aop诞生了。它在不修改接口原有逻辑的情况下,把接口切分为多个逻辑单元。
它很好的降低了这方面的耦合性,提高了代码的灵活性和可扩展性。
它目前的主要作用有:日志记录、安全控制、异常处理、事务处理、安全控制等功能。
.net8 中Aop的运用
首先说下:本篇Aop的运用是结合Autofac一起使用,如果对Autofac太不明白,请移步从0到1搭建权限管理系统系列四 .net8 中Autofac的使用
 安装:Castle.DynamicProxy(选择最新)、Autofac.Extras.DynamicProxy(选择最新,最新的这个好像是包含了Castle.DynamicProxy)
编写Aop插件(AopPlugIn),代码如下
  1. /// <summary>
  2. /// aop插件
  3. /// </summary>
  4. public class AopPlugIn : IInterceptor
  5. {
  6.     /// <summary>
  7.     /// 拦截
  8.     /// </summary>
  9.     /// <param name="invocation"></param>
  10.     public void Intercept(IInvocation invocation)
  11.     {
  12.         //当前调用方法名称
  13.         var methodName = invocation.Method.Name;
  14.         //当前调用方法所在服务名称
  15.         var interfaceServiceName = "I" + invocation.TargetType.Name;
  16.         //获取当前调用的方法信息
  17.         var methodInfo = invocation.Method;
  18.         //当前方法参数数量
  19.         var methodParameterCount = methodInfo.GetParameters().Length;
  20.         // 当前接口所有参数
  21.         foreach (var parameter in methodInfo.GetParameters())
  22.         {
  23.             //参数名称
  24.             var ParameterName = parameter.Name;
  25.             //参数值
  26.             var ParameterValue = invocation.Arguments[parameter.Position];
  27.             //参数类型
  28.             var ParameterType = invocation.Arguments[parameter.Position] == null ? string.Empty : invocation.Arguments[parameter.Position].GetType().Name;
  29.         }
  30.         /*
  31.          你可以在方法执行前,编写任何逻辑
  32.          */
  33.         //执行调用方法
  34.         invocation.Proceed();
  35.         /*
  36.          你可以在方法执行后,编写任何逻辑
  37.          */
  38.         //当前接口返回值
  39.         var value = invocation.ReturnValue;
  40.     }
  41. }
复制代码
代码解释:该插件相当于一个拦截器,只要被Autofac注册的服务并且要求拦截,那么该服务下的所有接口都会进入拦截器中。
Intercept():在该aop中方法中可以获取当前调用接口的名称、服务名称、参数、返回值等
invocation.Proceed():执行当前调用的接口。在该方法前后做一些逻辑操作,如日志、性能监控、异常监控等。
在Autofac中添加Aop集成服务
如果对Autofac太不明白,请移步从0到1搭建权限管理系统系列四 .net8 中Autofac的使用
编写好aop的插件后,我们需要把aop插件集成到Autofac中,配合完成接口的拦截。代码如下
  1. /// <summary>
  2. /// Autofac插件
  3. /// </summary>
  4. public class AutofacPlugIn : Autofac.Module
  5. {
  6.     /// <summary>
  7.     /// 重写Autofac的Load方法
  8.     /// </summary>
  9.     /// <param name="containerBuilder"></param>
  10.     protected override void Load(ContainerBuilder containerBuilder)
  11.     {
  12.         //服务项目程序集
  13.         Assembly service = Assembly.Load("DomainService");
  14.         Assembly intracface = Assembly.Load("Infrastructure");
  15.         //注册aop
  16.         containerBuilder.RegisterType(typeof(AopPlugIn));
  17.         //项目必须以xxx结尾
  18.         containerBuilder.RegisterAssemblyTypes(service).Where(n => n.Name.EndsWith("Service") && !n.IsAbstract)
  19.             .InstancePerLifetimeScope().AsImplementedInterfaces().InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors();
  20.         containerBuilder.RegisterAssemblyTypes(intracface).Where(n => n.Name.EndsWith("Repository") && !n.IsAbstract)
  21.            .InstancePerLifetimeScope().AsImplementedInterfaces();
  22.     }
  23. }
复制代码
代码解释:containerBuilder.RegisterType(typeof(AopPlugIn));必须要先注册aop,然后通过InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors()集成到Autofac中。
这里要注意下,我们可以在后面添加where条件,来确定哪些接口需要拦截。如果不添加,那么就会拦截Autofac中所有的接口
测试
aop的使用,其实就是一个拦截器,拦截被autofac注入的服务接口,所以配置非常简单,当然所有的技术都不是完美的,要看系统进行选择。
执行之前我们搭建好的接口

执行:查询所有用户接口GetAllUser()

可以看到,该接口被成功拦截。我们可以自由的在方法前后,添加业务逻辑,它不会改变原有接口逻辑。

以上是一些接口的基本信息,及返回值,当然我们可以获取更多接口的信息。
有了这些信息后,我们就可以做很多逻辑操作,比如之前说的:日志记录、性能监控、调用监控、异常信息、事务处理等。
 
以上就是全局异常捕获机制,感兴趣的可以下载项目,修改吧。
源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  
预览地址:http://139.155.137.144:8880/swagger/index.html
帮我Star,谢谢。
有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界
 

来源:https://www.cnblogs.com/cyzf/p/18467560
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具