制订控制器缓存

很多时候需要对控制器返回的数据进行缓存,这样的好处就是在二次获取的时候不再需要重新处理相关加载逻辑从而提供现好的输出性能。组件可以通过过虑器功能把缓存引入到控制器处理层面,从而让使用者在不修改逻辑的情况即可实现这功能的调整。

缓存过虑器实现

复制代码
    public class ActionCacheFilter:FilterAttribute
    {

        private static System.Collections.Concurrent.ConcurrentDictionary<string, object> mCache = new System.Collections.Concurrent.ConcurrentDictionary<string, object>();

        public override bool Executing(ActionContext context)
        {
            string key = context.Handler.GetCackeKey(context.Parameters);
            if(mCache.TryGetValue(key,out object result))
            {
                context.Result = result;
                return false;
            }
            return base.Executing(context);
        }

        public override void Executed(ActionContext context)
        {
            base.Executed(context);
            string key = context.Handler.GetCackeKey(context.Parameters);
            mCache[key] = context.Result;
        }
    }
复制代码

在过虑器中可以通过组件的Handler.GetCackeKey方法来获取当前请求的唯一标识,通过唯一标识就可以进行缓存存储和读取操作;以上实现也非常简单在Executing过程中检测缓存是否存在,如果存在则返回结果,否则继续往下执行。在Executed过程中把执行结果设置到缓存中.

控制器引入

当实现了相关控制器后,就可以把控制器添加到全局的Filers,控制器或指定的方法上。

        [ActionCacheFilter]
        public object GetTime([CacheKeyParameter]string name)
        {
            Console.WriteLine($"{name} get time");
            return DateTime.Now;
        }

如果唯一标识是依据某一参数的情况,可以在参数上标记上CacheKeyParameter

posted @   beetlex  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2018-09-17 dotnet core高吞吐Http api服务组件FastHttpApi
2014-09-17 azure存储压测的问题(农码主观意识太强被坑了)
点击右上角即可分享
微信分享提示