.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;
            }
        }
    }
}
相关推荐
wei_shuo12 分钟前
KES 故障诊断与应急响应:问题排查、根因分析与应急预案
后端
LinMINGJing00713 分钟前
postgre分区方式
后端
王中阳Go19 分钟前
业务代码凭什么不能直接调 Agent?——我在律所 AI 项目里做的 Harness 运行时治理
人工智能·后端·程序员
SomeB1oody1 小时前
【RustyML入门】7.2. 深入模型持久化
开发语言·后端·机器学习·rust·教程
知几蜗牛1 小时前
0 后端 · 0 数据库 · 0 备案:用 AI 两天搓出的股票管理系统,开源了
前端·后端·llm
风流 少年1 小时前
Spring AI 2.0:阿里云百炼平台(工作流应用)
java·后端·spring
__zRainy__2 小时前
Node系列 · 数据库:单表查询
数据库·后端·mysql·node.js
诺伦2 小时前
Rust 错误处理实战:从 unwrap 到优雅 Result 的进阶之路
开发语言·后端·rust
不能放弃治疗2 小时前
上下文压缩机制
后端
QQ_21696290963 小时前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端