.NET 使用 IResourceFilter 进行资源缓存

一、使用演示

  1. 创建 CustomResourceFilter 实现类
csharp 复制代码
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IResourceFilter
    {


        /// <summary>
        /// 在xxx资源之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("before");
        }

        /// <summary>
        /// 在xxx资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("after");
        }

    }
}
  1. 在需要过滤的方法上添加注解[CustomResourceFilter],填写参数名为刚刚创建的类名
  1. 测试

二、应用场景------缓存

2.1 演示代码

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IResourceFilter
    {

        // 定义一个缓存区域
        private static Dictionary<string,object> cache = new Dictionary<string, object>();

        /// <summary>
        /// 在xxx资源之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // 如果有缓存,则返回缓存值
            string key = context.HttpContext.Request.Path;
            if (cache.ContainsKey(key))
            {
                Console.WriteLine("有缓存了,调用缓存");
                // 只要是给result赋值了,就会终止执行,直接返回结果给调用方
                context.Result = (IActionResult?)cache[key];
            }
        }

        /// <summary>
        /// 在xxx资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("方法已经执行了,将结果存入缓存");
            string key = context.HttpContext.Request.Path;
            // 计算结果保存到缓存中
            cache[key] = context.Result;
        }

    }
}

2.2 测试

三、 异步版本 IAsyncResourceFilter

3.1 演示代码

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IAsyncResourceFilter
    {
        /// <summary>
        /// 当xxx资源去执行时
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            await Console.Out.WriteLineAsync("异步方法执行前");

            ResourceExecutedContext resourceExecutedContext = await next.Invoke();

            await Console.Out.WriteLineAsync("异步方法执行后");
        }
    }
}

3.2 代码改造

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IAsyncResourceFilter
    {

        // 定义一个缓存区域
        private static Dictionary<string, object> cache = new Dictionary<string, object>();

        /// <summary>
        /// 当xxx资源去执行时
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            string key = context.HttpContext.Request.Path;
            if (cache.ContainsKey(key))
            {
                Console.WriteLine("有缓存了,调用缓存");
                // 只要是给result赋值了,就会终止执行,直接返回结果给调用方
                context.Result = (IActionResult?)cache[key];
            }
            else
            {
                ResourceExecutedContext resourceExecutedContext = await next.Invoke();
                Console.WriteLine("方法已经执行了,将结果存入缓存");
                // 计算结果保存到缓存中
                cache[key] = context.Result;
            }
        }
    }
}
相关推荐
你的人类朋友20 小时前
说说签名与验签
后端
databook20 小时前
Manim实现脉冲闪烁特效
后端·python·动效
canonical_entropy1 天前
AI时代,我们还需要低代码吗?—— 一场关于模型、演化与软件未来的深度问答
后端·低代码·aigc
颜如玉1 天前
HikariCP:Dead code elimination优化
后端·性能优化·源码
考虑考虑1 天前
Jpa使用union all
java·spring boot·后端
bobz9651 天前
virtio vs vfio
后端
Rexi1 天前
“Controller→Service→DAO”三层架构
后端
bobz9651 天前
计算虚拟化的设计
后端
深圳蔓延科技1 天前
Kafka的高性能之路
后端·kafka
Barcke1 天前
深入浅出 Spring WebFlux:从核心原理到深度实战
后端