zoukankan      html  css  js  c++  java
  • 什么是面向切面编程AOP

    一丶前言

      看过一些描述关于AOP切面编程的文章,写的太概念化让人很难理解,下面是我自己的理解,希望能帮到新人,如有错误欢迎指正。

    二丶AOP是什么,它的应用场景是什么?

      AOP也跟IOC,OOP这些思想一样它只是一种编程思想。Autofac、Spring.Net、Castle这些组件实现了AOP切面编程思想的框架。AOP说白了就是在运行时,动态的将代码切入到类的指定方法的指定位置上,这种思想就是面向切面的编程思想。

    如果你发现你的方法中有很多重复的代码就可以考虑用aop来精简代码了。比如说你想监控每个方法的耗时,按照传统的方法是每个方法都加上监控代码,如果用AOP思想去解决这个问题,就可以把监控代码放到方法的外面去写。

    AOP思想的应用场景:

      AOP切面缓存

      权限认证

      错误处理

      调试

      日志记录

      性能监控

      数据持久化

      AOP事务

    三丶AOP切面执行流程

      AOP切面有点像拦截器,不过跟拦截器有点区别。

    四丶代码例子

      这个例子开发环境使用的是.Net Core 3.0,用的AOP框架是Autofac,通过Nuget安装Autofac.Extras.DynamicProxy组件。

      功能是AOP切面缓存,把查询结果缓存到Redis里,不用每次都查询数据库。

      使用步骤

      1.Startup中把BlogCacheAOP切面 切入到Titan.Blog.AppService.dll下所有接口实现里。

    var servicesDllFile = Path.Combine(basePath, "Titan.Blog.AppService.dll");//获取项目绝对路径
                var assemblysServices = Assembly.LoadFile(servicesDllFile);
                builder.RegisterAssemblyTypes(assemblysServices)
                    .AsImplementedInterfaces()
                    .InstancePerLifetimeScope()
                    .EnableInterfaceInterceptors()
                    .InterceptedBy(typeof(BlogCacheAOP));//AOP切面缓存

      2.切面公共代码

      3.给方法标记特性,只有指定特性的方法才会执行公共代码

            /// <summary>
            /// 获取系统中所有的权限
            /// </summary>
            /// <returns></returns>
            [Caching(AbsoluteExpiration = 10)]
            public async Task<List<SysRoleModuleButtonDto>> GeRoleModule()
            {
                var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);//
                var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>();
                if (roleModuleButton.Count > 0)
                {
                    foreach (var item in roleModuleButton)
                    {
                        item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault();
                        item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault();
                    }
    
                }
                return roleModuleButton;
            }

    这个是AOP切面缓存,它的功能是将包含CachingAttribute特性的方法的返回值缓存到Redis里,下次在访问这个方法,会先去缓存中查询如果有则直接跳过这个方法,直接从Redis里获取之前缓存的结果集,如果没有则会执行方法获取返回值在缓存到Redis里。

    以此,我们可以开发其他类似功能,比如性能监控,日志监控,AOP事务,是不是很强大。具体代码执行流程请下载这个项目(下面有github地址),自己调试下上面的例子就明白了。

    *****还有一个要注意的,我这个项目控制器和服务实现解耦了,如果没有解耦的话,控制器直接调服务的话,AOP注册方式和服务要做修改。

      1.Startup中AOP注册代码

                ////标记了虚方法virtual的才会进入切面
                var assemblysModels = Assembly.Load("Titan.Blog.AppService");
                builder.RegisterAssemblyTypes(assemblysModels)
                    .EnableClassInterceptors()
                    .InterceptedBy(typeof(BlogCacheAOP));

      2.方法要加上virtual,否则进不了切面

            /// <summary>
            /// 获取系统中所有的权限
            /// </summary>
            /// <returns></returns>
            [Caching(AbsoluteExpiration = 10)]
            public virtual async Task<List<SysRoleModuleButtonDto>> GeRoleModule()
            {
                var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);//
                var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>();
                if (roleModuleButton.Count > 0)
                {
                    foreach (var item in roleModuleButton)
                    {
                        item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault();
                        item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault();
                    }
    
                }
                return roleModuleButton;
            }

      3.切面代码不需要改动

    四丶结语

      AOP思想实际上就是想把业务和公共的处理分开,对原有的代码没有一点入侵。我觉得学习一个新技术之前,先别读那么多概念性的东西,感觉越看越糊涂,只会对学习新技术产生恐惧和抵触心理。我们可以先看看新技术它能解决什么问题,实际应用场景是什么,这对学习新技术应该是有好处的。

     

    五丶Github Demo,演示地址

     

    Demo 源码地址,顺便给个Star谢谢了。 

     

    演示地址:http://gaobili.cn:8600/swagger/index.html

     加群一起学习共同进步。群号:963718093

    .Net Core 开源学习交流

    本人也在学习阶段,如果有错误的地方欢迎批评指正,谢谢。
  • 相关阅读:
    《C# 爬虫 破境之道》:第二境 爬虫应用 — 第二节:以事件驱动状态、数据处理
    量化投资学习笔记37——《Python机器学习应用》课程笔记10
    量化投资学习笔记36——《Python机器学习应用》课程笔记09
    量化投资学习笔记35——《机器学习入门》第一部分
    量化投资学习笔记34——《Python机器学习应用》课程笔记08
    量化投资学习笔记33——《Python机器学习应用》课程笔记07
    量化投资学习笔记32——《Python机器学习应用》课程笔记06
    量化投资学习笔记31——《Python机器学习应用》课程笔记05
    量化投资学习笔记30——《Python机器学习应用》课程笔记04
    量化投资学习笔记29——《Python机器学习应用》课程笔记03
  • 原文地址:https://www.cnblogs.com/HanJunJun-blog/p/10650509.html
Copyright © 2011-2022 走看看