Skip to content

制订控制器缓存

Henry edited this page Sep 10, 2019 · 2 revisions

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

缓存过虑器实现

    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