日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

.Net?Core?Aop之IResourceFilter的具體使用_實用技巧

作者:SportSky ? 更新時間: 2022-04-25 編程語言

一、簡介

在.net core 中Filter分為以下六大類:

  • 1、AuthorizeAttribute(權限驗證)
  • 2、IResourceFilter(資源緩存)
  • 3、IActionFilter(執行方法前后的記錄)
  • 4、IResultFilter(結果生成前后擴展)
  • 5、IAlwaysRun(響應結果的補充)
  • 6、IExceptionFilter(異常處理)

二、IResourceFilter(同步資源緩存)

1、定義Filter

public class CustomerResourceFilterAttribute : Attribute, IResourceFilter
    {
        private static Dictionary cacheDic=new Dictionary();
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var path=context.HttpContext.Request.Path; 
            if (cacheDic.ContainsKey(path))
            {
                context.Result = (IActionResult)cacheDic[path];
            }
            Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecuting");
        }
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            var path = context.HttpContext.Request.Path;
            cacheDic[path] = context.Result;
            Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecuted");
        }

        
    }

2、使用Filter

public class HomeController : Controller
    {
        private readonly ILogger _logger;

        public HomeController(ILogger logger)
        {
            _logger = logger;
            Console.WriteLine($"執行 {this.GetType().Name} 構造函數");
        }

        [CustomerResourceFilter]
        public IActionResult Index()
        {
            ViewBag.Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            return View();
        }
    }

3、前端頁面代碼

@{
    ViewData["Title"] = "Home Page";
}


來自于控制器的結果:@ViewBag.Data

來自于頁面的結果:@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

4、頁面效果

按F5可以看到頁面值的變化效果,"來自于控制器的結果"的值會一直不變,“來自于頁面的結果”隨著頁面刷新,值會一直變化

三、IAsyncResourceFilter(異步資源緩存)

public class CustomerAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
    {
        private static Dictionary cacheDic = new Dictionary();
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecutionAsync Before");

            var path = context.HttpContext.Request.Path;
            if (cacheDic.ContainsKey(path))
            {
                context.Result = (IActionResult)cacheDic[path];
            }
            else
            {
                ResourceExecutedContext resource =await next.Invoke();
                cacheDic[path] = resource.Result; // 這句話的執行就是去執行控制器的構造函數+Action
                Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecutionAsync After");
            }
            

        }
    }

四、總結

不管是同步還是異步,他們的執行順序其實都是一樣的,下面是同步和異步分別打印的日志記錄:

1、同步日志

2、異步日志

原文鏈接:https://www.cnblogs.com/sportsky/p/15915959.html

欄目分類
最近更新