.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、异步日志