.Net6中对AOP的支持之IResourceFilter

环境:.Net 6  Web项目 MVC架构

开发工具: VS2022

 

IResourceFilter(资源缓存同步)

IResourceFilter扩展

   ASP.NET Core6提供的是接口IResourceFilter

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

作用是做同步缓存

执行顺序

  A 先执行OnResourceExecuting(xx资源之前)

  B 再执行构造函数

  C 执行Action

  D 最后执行OnResourceExecuted(xx资源之后)

 

缓存构造步骤

     1定义一个缓存区域

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

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

 

实现IResourceFilter

1定义特性类

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

      public class CustomCacheResourceFilterAttribute : Attribute, IResourceFilter

2定义静态字典做缓存

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

3 OnResourceExecuting(xx资源之前)

       如果缓存中有值,证明不是第一次,读取缓存中的值

    注意:这里是在执行构造函数、Action之前

          string key = context.HttpContext.Request.Path;//请求的路径

            if (_dictionary.ContainsKey(key))//如果缓存中有值

            {

                // context.Result IActionResult类型,做强转

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

            }

4 OnResourceExecuted(xx资源之后)

    如果请求过来时有值,将值加入到缓存中

注意:这里是Action执行完成之后

    string key = context.HttpContext.Request.Path;//请求路径

            if (context.Result != null)

            {

                _dictionary[key] = context.Result;//把值加入到缓存当中去

            }

5 加入特性标记

   在需要缓存的方法上标记特性

    [CustomCacheResourceFilter]

        public IActionResult Index()

        {

            {

               //此处是处理的业务逻辑,或返回的处理结果 省略..........

            }

            ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");

            return View();

        }

 

完整代码示例

特性类:

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

namespace WebApplication1.Untity.Filters
{
    /// <summary>
    /// 使用特性进行扩展,实现IResourceFilter接口
    /// </summary>
    public class CustomCacheResourceFilterAttribute : Attribute, IResourceFilter
    {

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

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

        /// <summary>
        /// 在xx资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
          
            string key = context.HttpContext.Request.Path;//请求路径
            if (context.Result != null)
            {
                _dictionary[key] = context.Result;//把值加入到缓存当中去
            }

        }

        /// <summary>
        /// 在xx资源之前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            string key = context.HttpContext.Request.Path;//请求的路径
            if (_dictionary.ContainsKey(key))//如果缓存中有值
            {
                // context.Result 是IActionResult类型,做强转
                context.Result = (IActionResult)_dictionary[key];
            }

        }
    }
}

 

Action

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

 

前端

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

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

 

posted @ 2023-02-09 16:22  唐什么来着  阅读(152)  评论(0编辑  收藏  举报