面向切面编程aop简单讲解aop面向切面编程应用场景如何理解aop面向切面编程




面向切面编程aop简单讲解aop面向切面编程应用场景如何理解aop面向切面编程

2022-07-21 2:26:45 网络知识 官方管理员


一、前言

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

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

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

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

AOP思想的应用场景:

  • AOP切面缓存
  • 权限认证
  • 错误处理
  • 调试
  • 日志记录
  • 性能监控
  • 数据持久化
  • AOP事务

三、AOP切面执行流程

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

面向切面编程aop简单讲解(aop面向切面编程应用场景)(1)

四、代码例子

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

使用步骤

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

varservicesDllFile=Path.Combine(basePath,"Titan.Blog.AppService.dll");//获取项目绝对路径

varassemblysServices=Assembly.LoadFile(servicesDllFile);

builder.RegisterAssemblyTypes(assemblysServices)

.AsImplementedInterfaces()

.InstancePerLifetimeScope()

.EnableInterfaceInterceptors()

.InterceptedBy(typeof(BlogCacheAOP));//AOP切面缓存

2.切面公共代码

面向切面编程aop简单讲解(aop面向切面编程应用场景)(2)

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

///<summary>

///获取系统中所有的权限

///</summary>

///<returns></returns>

[Caching(AbsoluteExpiration=10)]

publicasyncTask<List<SysRoleModuleButtonDto>>GeRoleModule()

{

vardto=await_iSysRoleModuleButtonRepository.QueryAsNoTracking(x=>x.ModuleType==0);//

varroleModuleButton=dto.MapToList<SysRoleModuleButton,SysRoleModuleButtonDto>();

if(roleModuleButton.Count>0)

{

foreach(variteminroleModuleButton)

{

item.SysRole=_iSysRoleRepository.QueryBySql($"select*fromSysRolewhereSysRoleId='{item.SysRoleId}'andIsDelete!=1andRoleStatus=1").Result.FirstOrDefault();

item.SysModule=_iSysModuleRepository.QueryBySql($"select*fromSysModulewhereSysModuleId='{item.SysModuleId}'andModuleStatus=1andIsDelete!=1").Result.FirstOrDefault();

}

}

returnroleModuleButton;

}

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

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

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

1.Startup中AOP注册代码

////标记了虚方法virtual的才会进入切面

varassemblysModels=Assembly.Load("Titan.Blog.AppService");

builder.RegisterAssemblyTypes(assemblysModels)

.EnableClassInterceptors()

.InterceptedBy(typeof(BlogCacheAOP));

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

///<summary>

///获取系统中所有的权限

///</summary>

///<returns></returns>

[Caching(AbsoluteExpiration=10)]

publicvirtualasyncTask<List<SysRoleModuleButtonDto>>GeRoleModule()

{

vardto=await_iSysRoleModuleButtonRepository.QueryAsNoTracking(x=>x.ModuleType==0);//

varroleModuleButton=dto.MapToList<SysRoleModuleButton,SysRoleModuleButtonDto>();

if(roleModuleButton.Count>0)

{

foreach(variteminroleModuleButton)

{

item.SysRole=_iSysRoleRepository.QueryBySql($"select*fromSysRolewhereSysRoleId='{item.SysRoleId}'andIsDelete!=1andRoleStatus=1").Result.FirstOrDefault();

item.SysModule=_iSysModuleRepository.QueryBySql($"select*fromSysModulewhereSysModuleId='{item.SysModuleId}'andModuleStatus=1andIsDelete!=1").Result.FirstOrDefault();

}

}

returnroleModuleButton;

}

3.切面代码不需要改动

五、结语

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

发表评论:

最近发表
网站分类
标签列表