飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

.Net Core Aop之IResourceFilter

时间:2022-02-22  作者:sportsky  

一、简介

在.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<string,object> cacheDic=new Dictionary<string, object>();
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var path=域名域名; 
            if (域名ainsKey(path))
            {
                域名lt = (IActionResult)cacheDic[path];
            }
            域名eLine("域名sourceExecuting");
        }
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            var path = 域名域名;
            cacheDic[path] = 域名lt;
            域名eLine("域名sourceExecuted");
        }

        
    }

2、使用Filter

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
            域名eLine($"执行 {域名ype().Name} 构造函数");
        }

        [CustomerResourceFilter]
        public IActionResult Index()
        {
            域名 = 域名ring("yyyy-MM-dd HH:mm:ss");
            return View();
        }
    }

3、前端页面代码

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


<h3>来自于控制器的结果:@域名</h3>
<h3>来自于页面的结果:@域名ring("yyyy-MM-dd HH:mm:ss")</h3>

4、页面效果

按F5可以看到页面值得变化效果,"来自于控制器的结果"的值会一直不变,“来自于页面的结果”随着页面刷新,值会一直变化

三、IResourceFilter(异步资源缓存)

public class CustomerAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
    {
        private static Dictionary<string, object> cacheDic = new Dictionary<string, object>();
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            域名eLine("域名sourceExecutionAsync Before");

            var path = 域名域名;
            if (域名ainsKey(path))
            {
                域名lt = (IActionResult)cacheDic[path];
            }
            else
            {
                ResourceExecutedContext resource =await 域名ke();
                cacheDic[path] = 域名lt; // 这句话的执行就是去执行控制器的构造函数+Action
                域名eLine("域名sourceExecutionAsync After");
            }
            

        }
    }

四、总结

不管是同步还是异步,他们的执行顺序其实都是一样的,下面是同步和异步分别打印的日志记录:

1、同步日志

2、异步日志

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。