C# 面向切片编程AOP
一、面向切片编程AOP
1、场景一:运行很久的项目需要增加新的功能,如要增加异常日志记录及处理,那应该怎么办呢?
如果直接增加代码,将造成重复代码,增加了大量测试工作。所以最好的方法就是使用AOP
AOP 全称Aspect Oriented Programming 在不修改之前代码为基础,可以动态增加业务逻辑。
ASP.NET CORE 中的AOP
1 AuthorizeAttrbute 权限验证
2 IRescourceFiter 资源缓存
IRescourceFiter 的场景应用
1、天生为了缓存而生
2、支持扩展缓存
新建一个Attrbute为后缀的类,继承Attribute, IResourceFilter
using Microsoft.AspNetCore.Mvc.Filters;
namespace Asp.net6.Utility.Filters
{
public class CUMSFilterAttribute : Attribute, IResourceFilter
{
/// <summary>
/// 在XX资源之前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
Console.WriteLine("执行之前");
}
/// <summary>
/// 在XX资源之后
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
Console.WriteLine("执行之后");
}
}
}
在方法前调用CUMSFilterAttribute
[CUMSFilter]
public IActionResult Index()
{
{
//这里是业务逻辑
}
return View();
}
执行顺序
1、CUMSFilterAttribute .OnResourceExecuting
2、控制器的构造参数–实例化控制器
3、执行Action方法
4、CUMSFilterAttribute .OnResourceExecuted
具体案例
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Asp.net6.Utility.Filters
{
public class CUMSFilterAttribute : Attribute, IResourceFilter
{
//1.定义了一个缓存区域
//2.请求来了,根据缓存标识--判断如果有缓存,返回缓存的值
//3.如果没有缓存做计算
//4.计算结果保存到缓存中去
//定义静态缓存区
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 在XX资源之前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
string Key = context.HttpContext.Request.Path;//请求的路径
if (CacheDictionary.ContainsKey(Key)) {
//只要给Result赋值了,就会中断执行,直接返回调用方
context.Result =(IActionResult) CacheDictionary[Key];
}
Console.WriteLine("执行之前");
}
/// <summary>
/// 在XX资源之后
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
string Key = context.HttpContext.Request.Path;//请求的路径
CacheDictionary[Key] = context.Result;
Console.WriteLine("执行之后");
}
}
}