.net core 使用 AspectCore 实现简易的AopCache。
(第一次写博客,好紧张!!!)
源码地址:传送门
项目中有很多缓存的需求,能自己定义缓存key和时间,能根据key去清理缓存。
网上找了一圈,有很多基于aop的缓存组件,但是都不满足我的需求。故造了个轮子。
新建web项目 .net core mvc TestAopCache

安装 AopCache
Install-Package AopCache -Version 0.1.1
属性说明
AopCache一共3个属性:
Key:缓存的键值,字符串,可以包含占位符 如 {userId}。如果key为空,将用类名+方法名作为键值
Type:表示时间类型,枚举。秒、分、小时、天 四种。默认秒
Length:时间长度,0 表示永不过去。默认 0
标记方式有两种
1、在接口的方法上加 [AopCache]
2、没有接口,直接在类的方法上加 [AopCache],前提是此方法必须用 virtual修饰
存储方式
默认是 MemoryCache,不过你可以实现 IAopCacheProvider 接口,实现自己的存储。
新建 ITestService,在方法上加 [AopCache]
public interface ITestService
{
//默认时间单位是秒,长度为0,即永不过期
[AopCache(Key = "aaa")]
string GetByKey(); //设置3秒过期 这里的“{userId}”,占位符。用参数 userId 的值去替换
[AopCache(Key = "bbb_{userId}", Length = )]
string GetByKeyAndParamter(int userId); //设置十分钟过期 这里的“{req:Id}”,占位符。用参数 req里面的Id 的值去替换
[AopCache(Key = "ccc_{req:Id}_{type}", Type = CacheTimeType.Minute, Length = )]
Task<UserInfo> GetUserInfo(int type, Req req);
}
//实现接口
public class TestService : ITestService
{
public string GetByKey()
{
return Guid.NewGuid().ToString("N");
} public string GetByKeyAndParamter(int userId)
{
return Guid.NewGuid().ToString("N") + "---" + userId;
} public async Task<UserInfo> GetUserInfo(int type, Req req)
{
return new UserInfo()
{
Id = new Random().Next(, ),
Name = Guid.NewGuid().ToString("N")
};
}
}
直接在类的方法上加标签
public class TestSingleClass
{
[AopCache(Key = "TestSingleClassKey")]
public virtual string Get()
{
return Guid.NewGuid().ToString("N");
}
}
Startup中配置注入
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
//... //注入打了标签的Service
services.AddTransient<ITestService, TestService>();
services.AddTransient<TestSingleClass>(); //自定义存储 这里xxx表示 IAopCacheProvider 的实现
//services.AddAopCache<xxx>(); //默认内存存储
//返回IServiceProvider,由 AspectCore接管
return services.AddAopCacheUseDefaultMemoryProvider(); //此方法的内部实现,这里包装一层
//if (setupAction == null)
//{
// services.AddMemoryCache();
//}
//else
//{
// services.AddMemoryCache(setupAction);
//}
//services.AddSingleton<IAopCacheProvider, DefaultAopCacheProvider>();
//services.ConfigureDynamicProxy();
//return services.BuildAspectInjectorProvider();
}
直接在HomeController 中使用
public class HomeController : Controller
{
private ITestService TestService { get; set; } private TestSingleClass TestSingleClass { get; set; } private IAopCacheProvider AopCacheProvider { get; set; } public HomeController(ITestService testService, TestSingleClass testSingleClass, IAopCacheProvider aopCacheProvider)
{
TestService = testService; TestSingleClass = testSingleClass; AopCacheProvider = aopCacheProvider;
} public IActionResult Index()
{
//在这里清除某个key
//清除 GetUserInfo
AopCacheProvider.Remove("ccc_1000_1"); return View();
} public async Task<IActionResult> Privacy()
{
//第一次获取值 生成的key是 aaa
var v1 = TestService.GetByKey(); //生成的key是 bbb_1,占位符被替换:bbb_{userId} => bbb_1
var v2 = TestService.GetByKeyAndParamter(); //生成的key是 ccc_1000_1,占位符被替换:ccc_{req:Id}_{type} => ccc_1000_1
var v3 = await TestService.GetUserInfo(, new Req() { Id = }); //直接在类的方法上加标记,但是方法必须加 virtual
//生成的key是 TestSingleClassKey
var v4 = TestSingleClass.Get(); //第二次获取值
var v1New = TestService.GetByKey(); var v2New = TestService.GetByKeyAndParamter(); var v3New = await TestService.GetUserInfo(, new Req() { Id = }); var v4New = TestSingleClass.Get(); var sb = new StringBuilder();
sb.AppendLine($"GetByKey(永不过期):第一次=> {v1}");
sb.AppendLine($"GetByKey(永不过期):第二次=> {v1New}"); sb.AppendLine($"GetByKeyAndParamter(3秒):第一次=> {v2}");
sb.AppendLine($"GetByKeyAndParamter(3秒):第二次=> {v2New}"); sb.AppendLine($"GetUserInfo(十分钟):第一次=> {Newtonsoft.Json.JsonConvert.SerializeObject(v3)}");
sb.AppendLine($"GetUserInfo(十分钟):第二次=> {Newtonsoft.Json.JsonConvert.SerializeObject(v3New)}"); sb.AppendLine($"TestSingleClass.Get(永不过期):第一次=> {v4}");
sb.AppendLine($"TestSingleClass.Get(永不过期):第二次=> {v4New}"); return Content(sb.ToString());
} [ResponseCache(Duration = , Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
F5运行

点击 “Privacy”,疯狂刷新,查看效果。

切换回首页,清除 GetUserInfo 的缓存,再切换到Privacy,发现 GetUserInfo 的缓存已改变。

到此结束,如果你刚好有这需求,可以参考此文章。源码传到gayhub,求轻拍 ==
.net core 使用 AspectCore 实现简易的AopCache。的更多相关文章
- [Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍
AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...
- ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系
ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...
- .NetCore中使用AspectCore、ExceptionLess 实现AOP操作日志记录
结合前面封装的ExceptionLess,接下来使用 AspectCore 实现AOP日志处理 nuget导入AspectCore.Core .AspectCore.Extensions.Depend ...
- .netcore 中使用开源的AOP框架 AspectCore
AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...
- 基于asp.net core 从零搭建自己的业务框架(一)
前言 asp.net core版本选择2.2,只是因为个人习惯了vs2017,代码以及设计皆可移植到vs2019,用asp.net core 3.0以及以上运行起来 项目类似选择web api,基础设 ...
- ASP.NET Core路由中间件[1]: 终结点与URL的映射
目录 一.路由注册 二.设置内联约束 三.默认路由参数 四.特殊的路由参数 借助路由系统提供的请求URL模式与对应终结点(Endpoint)之间的映射关系,我们可以将具有相同URL模式的请求分发给应用 ...
- 注册URL模式与HttpHandler的映射关系
注册URL模式与HttpHandler的映射关系 ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHan ...
- 利用.NET Core类库System.Reflection.DispatchProxy实现简易Aop
背景 Aop即是面向切面编程,众多Aop框架里Castle是最为人所知的,另外还有死去的Spring.NET,当然,.NET Core社区新秀AspectCore在性能与功能上都非常优秀,已经逐渐被社 ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
随机推荐
- HTML5中的Web Notification桌面通知(右下角提示)
html5桌面通知(Web Notifications)对于需要实现在新消息入线时,有桌面通知效果的情况下非常有用,在此简单介绍一下这个html5的新属性.通过Web Notifications(桌面 ...
- 如何用TFS build definition添加自动建立nuget package 步骤
参考网址:https://www.visualstudio.com/en-us/docs/build/steps/package/nuget-packager https://docs.nuget.o ...
- OPNET仿真软件资料合集
1. OPEN中国代理商业 http://www.credit-top.com/page/Default.asp?pageID=105
- AJAX-DOM事件
1.DOM事件 1.select的onchange事件 当选项框中的内容发生改变时需要出发的事件.2.Ajax 1.名词解释 1.同步 在一个任务进行中,不能开启其它的任务. 同步访问:浏览器在向服务 ...
- LSTM长短期记忆神经网络模型简介
LSTM网络也是一种时间递归神经网络,解决RNN的长期依赖关系. RNN模型在训练时会遇到梯度消失或者爆炸的问题,训练时计算和反向传播,梯度倾向于在每一时刻递增或递减,梯度发散到无穷大或者0..... ...
- tomcat7 安装 windows 服务
tomcat 可以安装成windows 服务,这样 每次启动就不需要启动tomcat了. 具体配置: 1.修改 service.bat 在行首添加 set "JAVA_HOME=E:\jdk ...
- iphone导入照片不显示,不同步怎么整
可以借助itools或者爱思助手来处理 进入电脑软件后 找到文件管理---->文件系统(用户)这个目录 找到photodata这个文件夹,将photos.sqlite文件删除 最重要的一步来了. ...
- 修改oralce数据库用户名和密码
首先以sys用户登录数据库 一.修改用户名 查到到所需修改用户名称的用户需要:select user#,name from user$;(例如查到有一个normal的用户对应的user#=61) 修改 ...
- mysql-libs版本冲突卸载不了
问题: 卸载mysql-libs时候出现如下依赖性无法卸载 [root@mail yum.repos.d]# rpm -e mysql-libserror: Failed dependencies: ...
- lf-8.4 数据的增删改
MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 ...