首页 > 其他分享 >.Net6对AOP的多种支持之IAsyncResourceFilter

.Net6对AOP的多种支持之IAsyncResourceFilter

时间:2023-02-09 16:46:32浏览次数:40  
标签:IAsyncResourceFilter 缓存 resource dictionary next key AOP Net6

 

环境:.Net6 Web项目 Mvc结构

开发工具: VS2022

IAsyncResourceFilter(资源缓存异步)

IAsyncResourceFilter扩展

   ASP.NET Core6提供的是接口IAsyncResourceFilter

   必须是自定义扩展 通过一个特性的支持

作用是做异步缓存

 

执行顺序

  实现的接口里有个委托参数,执行这个委托(就是执行构造方法和Action方法),所以需要以这个委托执行为界限,可在之前或者之后添加

需要执行的。

 

缓存构造步骤

     1定义一个缓存区域

     2请求过来后进行判断,如果有缓存返回缓存里的值,如果没有缓存则进行处理

     3把处理的结果加入缓存中

 

实现IAsyncResourceFilter

1定义特性类

       名称以Attribute结尾(标记特性时可以省略),继承Attribute、IAsyncResourceFilter(并实现该接口)

         public class CustomCacheAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter

 

2定义静态字典做缓存

             private static Dictionary<string, object> _dictionary = new Dictionary<string, object>();

3 判断缓存

   判断缓存中是否有key,如果有将值取出值

       string key = context.HttpContext.Request.Path;

            if (_dictionary.ContainsKey(key))

            {

                context.Result =(IActionResult) _dictionary[key];

            }

   如果没有值,则将值加入到缓存中去

 else

            {

                //next是一个委托,执行委托Invoke();

                //查看委托的返回类型为Task<ResourceExecutedContext>

                // Task<ResourceExecutedContext> resource = next.Invoke();

 

                //异步的时候,建设使用 async +await,

                ResourceExecutedContext resource = await next.Invoke();//这句话的执行就是去执行控制器的构造函数+Action方法

                if (resource.Result!=null)

                {

                    _dictionary[key] = resource.Result;

                }

 

            }

 

完整代码示例

特性类

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication1.Untity.Filters
{
    /// <summary>
    /// 使用特性进行扩展,实现IAsyncResourceFilter接口
    /// </summary>

    public class CustomCacheAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
    {
        //1定义一个缓存区域
        //2请求过来后进行判断,如果有缓存返回缓存里的值,如果没有缓存则进行处理
        //3把处理的结果加入缓存中

        private static Dictionary<string, object> _dictionary = new Dictionary<string, object>();

        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {

            Console.WriteLine("CustomCacheAsyncResourceFilterAttribute.OnResourceExecutionAsync Before");

            string key = context.HttpContext.Request.Path;
            //在xx资源之前
            if (_dictionary.ContainsKey(key))
            {
                context.Result =(IActionResult) _dictionary[key];
            }
            else
            {
                //next是一个委托,执行委托Invoke();
                //查看委托的返回类型为Task<ResourceExecutedContext>
                // Task<ResourceExecutedContext> resource = next.Invoke();

                //异步的时候,建设使用 async +await,
                ResourceExecutedContext resource = await next.Invoke();//这句话的执行就是去执行控制器的构造函数+Action方法
                //在xx资源之后
                if (resource.Result!=null)
                {
                    _dictionary[key] = resource.Result;
                }

            }


       
            Console.WriteLine("CustomCacheAsyncResourceFilterAttribute.OnResourceExecutionAsync After");

        }
    }
}

 

Action

        [CustomCacheAsyncResourceFilter]
        public IActionResult Index2() 
        {
            {
                //此处是处理的业务逻辑,或返回的处理结果 省略..........
            }
            ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");
            return View();
        }

前端

@{
    ViewData["Title"] = "Index2";
}

<h1>Index2</h1>
<h3>来自于控制器的计算结果:@ViewBag.Date</h3>
<h3>视图中实际计算的结果:@DateTime.Now.ToString("yyyy-MM-dd   ss")</h3>

 

标签:IAsyncResourceFilter,缓存,resource,dictionary,next,key,AOP,Net6
From: https://www.cnblogs.com/JohnTang/p/17105822.html

相关文章

  • Springboot整合AOP和注解,实现丰富的切面功能
    简介我们在文章《SpringAOP与AspectJ的对比及应用》介绍了AOP的使用,这篇文章讲解一下AOP与注解的整合,通过注解来使用AOP,会非常方便。为了简便,我们还是来实现一个计时的功......
  • Spring AOP与AspectJ的对比及应用
    1简介AOP,即面向切面编程是很常用的技术,特别是在JavaWeb开发中。而最流行的AOP框架分别是SpringAOP和AspectJ。2SpringAOPvsAspectJSpringAOP是基于SpringIoC实......
  • Spring23 - 基于XML配置的AOP
    基于XML的AOP准备工作参考基于注解的AOP环境实现在.xml文件中对AOP进行配置<context:component-scanbase-package="com.atguigu.aop.xml"></context:component-s......
  • Spring22 - 基于注解的AOP
    基于注解的AOP技术说明动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理JDK动态代理......
  • 使用注解实现AOP
            ......
  • Aop实现方式一
         ......
  • spring 重复注解和aop拦截的实现示例
    前言:1:jdk1.8开始支持重复注解@Repeatable实现2:aop拦截需要拦截当前注解和@Repeatable指向的包装注解才可以完全拦截到,因为:1.当在在方法上只有一个注解时,aop拦截......
  • 详解Spring AOP自定义可重复注解没有生效问题
    目录1.问题背景2.不啰嗦,上代码3.问题排查3.1是不是切点写得有问题,于是换成如下形式:3.2是不是使用的地方不是代理对象4.问题原因 1.问题背景工作中遇......
  • Spring AOP使用接口方式实现
    目录一.环境准备二、spring接口方式实现aop步骤1.业务接口实现2.业务类3.通知类4.自定义切##点5.配置xml文件6.方法入口三.分析Spring提供了很多的......
  • AOP实现原理
    ......