.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结尾(标记特性时可以省略),继承Attribute、IResourceFilter(并实现该接口)
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>