加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2020-12-10 13:09:07 所属栏目:编程 来源:网络整理
导读:这篇文章首要先容了Asp.net Core 3.1基于AspectCore实现AOP实现事宜、缓存拦截器成果,本文给各人先容的很是具体,对各人的进修或事变具有必然的参考小心代价,需

最近想给我的框架加一种成果,就是好比给一个要领加一个事宜的特征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。

public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) //用AspectCore替代默认的IOC容器 .UseServiceProviderFactory(new DynamicProxyServiceProviderFactory()); }

然后在Startup.cs类中的ConfigureServices中添加代码。(其拭魅这个加不加都可以,假如必要设置就加,譬喻全局的拦截器、只拦截哪些匹配的处事,由于我只用特征举办拦截,以是我就什么也没设置)

services.ConfigureDynamicProxy(o=> { //添加AOP的设置 });

这样AOP就设置好了,是不是很简朴。

虽然行使方面也必要留意一下,可以在接口、接口的要领、类,类的virtual要领长举办拦截。尚有假如你想拦截节制器的action的话,那必要在ConfigureService里AddControllerAsServices

services.AddControllers() //把节制器当成处事 .AddControllersAsServices()

下面我列出我的事宜拦截器代码,假如是特征拦截,就担任AbstractInterceptorAttribute,假如要写一个全局拦截器,就AbstractInterceptor,然后在ConfigureDynamicProxy中举办设置,这个我就不先容了

假如你的拦截器是放在其他项目标,那要记得添加AspectCore.Core包,不要只添加AspectCore.Abstractions,我一开始就只添加了AspectCore.Abstractions,一向没发明IsAsync、UnwrapAsyncReturnValue等一些扩展要领。

public class TransactionInterceptorAttribute : AbstractInterceptorAttribute { public async override Task Invoke(AspectContext context, AspectDelegate next) { var dbContext = context.ServiceProvider.GetService<AppDbContext>(); //先判定是否已经启用了事宜 if (dbContext.Database.CurrentTransaction == null) { await dbContext.Database.BeginTransactionAsync(); try { await next(context); dbContext.Database.CommitTransaction(); } catch (Exception ex) { dbContext.Database.RollbackTransaction(); throw ex; } } else { await next(context); } } }

然后我就可以这么优雅地行使事宜了

我再列出我的缓存拦截器,(感激网友的提示,我做了一下修改,针对异步要领返回值的处理赏罚),对了,下面的ICacheHelper是我界说的一个缓存助手接口,用的是redis,我会在后头写一篇博客

public class CacheInterceptorAttribute : AbstractInterceptorAttribute { /// <summary> /// 缓存秒数 /// </summary> public int ExpireSeconds { get; set; } public async override Task Invoke(AspectContext context, AspectDelegate next) { //判定是否是异步要领 bool isAsync = context.IsAsync(); //if (context.ImplementationMethod.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null) //{ // isAsync = true; /

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读