欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能

程序员文章站 2023-02-17 13:49:42
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。这个也是网上说的面向切面编程aop。ao...

最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。

这个也是网上说的面向切面编程aop。

aop的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等处理。

在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一个更轻量级的框架,aspectcore。

用起来非常非常的简单,但一开始还是走了一点弯路,主要是网上都是net core3以下的教程,3以下的使用方法跟之前有一些不同。

先安装nuget包,包名:aspectcore.extensions.dependencyinjection

然后在program.cs类中增加一行代码,这是net core 3的不同之处,这句添加的代码,意思就是用aspectcore的ioc容器替换内置的。因为aop需要依靠ioc实现,所以必须得替换掉内置的ioc。

然后在startup.cs类中的configureservices中添加代码。(其实这个加不加都可以,如果需要配置就加,例如全局的拦截器、只拦截哪些匹配的服务,因为我只用特性进行拦截,所以我就什么也没配置)

这样aop就配置好了,是不是很简单。

当然使用方面也需要注意一下,可以在接口、接口的方法、类,类的virtual方法上进行拦截。还有如果你想拦截控制器的action的话,那需要在configureservice里addcontrollerasservices

下面我列出我的事务拦截器代码,如果是特性拦截,就继承abstractinterceptorattribute,如果要写一个全局拦截器,就abstractinterceptor,然后在configuredynamicproxy中进行配置,这个我就不介绍了

如果你的拦截器是放在其他项目的,那要记得添加aspectcore.core包,不要只添加aspectcore.abstractions,我一开始就只添加了aspectcore.abstractions,一直没发现isasync、unwrapasyncreturnvalue等一些扩展方法。

然后我就可以这么优雅地使用事务了

Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能

我再列出我的缓存拦截器,(感谢网友的提醒,我做了一下修改,针对异步方法返回值的处理),对了,下面的icachehelper是我定义的一个缓存助手接口,用的是redis,我会在后面写一篇博客

我还弄了一个缓存删除拦截器,作用就是带有这个特性的方法执行后,会删除相关缓存值

为什么有这个设计呢,比如说我给一个方法 getuserlist 加了缓存,那我数据改变了怎么办,我想在user数据改变时,把这个缓存删除掉,那我就可以在saveuser方法上加上我这个缓存删除拦截器,那这个方法执行后,就会把相关的缓存删除掉了

aop的实现原理我也想象了一下:

要实现aop,需要依靠ioc容器,因为它是我们类的管家,那能被拦截的类必须是ioc注入的,自己new出来的是不受拦截的。如果我想在a方法前面添加点代码,那我告诉ioc,把代码给它,那ioc在注入a方法所在类时,会继承它生成一个派生类,然后重写a方法,所以拦截方法必须得为virtual,然后a方法里写上我要添加的代码,再base.a()这样。

到此这篇关于asp.net core 3.1基于aspectcore实现aop实现事务、缓存拦截器功能的文章就介绍到这了,更多相关asp.net core 3.1实现事务、缓存拦截器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!