AOP概述:AOP(面向切面编程)是一种编程规范的风格,通过'横切'的思想,将系统功能和业务功能分离开,以提高代码的可维护性和清晰度。
系统功能模块:
1、缓存模块:
作用:提高系统性能,通过缓存数据减少对数据库的直接访问。
操作:在代码进入业务功能之前的时候检查请求的数据中是否存在缓存中,如果不在就去数据库获取并存入缓存中。
2、验证模块:
作用:确保用户有权限访问特定业务方法。
操作:检查当前用户是否有权限,是否能进入下一步操作。
3.日志模块:
作用:记录用户操作和系统事件,便于后期分析和故障排查。
操作:在方法执行前后记录相关信息。
捕获异常后记录信息到日志中。
实现AOP:
可以通过创建一个自定义的过滤器类来实现。下面是一个简单的示例,演示如何创建和使用 ActionFilterAttribute
来拦截控制器动作,并在执行之前和之后插入自定义逻辑。
先安装依赖:
自定义过滤器实现类:
defaultActionFilter继承: ActionFilterAttribute 过滤器需要的方法。
public class defaultActionFilter: ActionFilterAttribute
{
//在执行业务代码之前可以执行的方法
public override void OnActionExecuting(ActionExecutingContext context)
{
// 在动作执行之前执行的代码
//实现一些系统功能代码
Debug.WriteLine("执行控制器代码之前Action is executing...");
}
//在执行业务代码之后可以执行的方法
public override void OnActionExecuted(ActionExecutedContext context)
{
// 在动作执行之后执行的代码
Debug.WriteLine("执行控制器代码之后Action has executed.");
}
//这些方法允许您在返回结果之前。您可以在这两个方法中处理结果(例如修改响应或记录结果信息)。
public override void OnResultExecuting(ResultExecutingContext context)
{
Console.WriteLine("返回结果之前");
// 结果执行前]
}
//业务代码执行返回结果之后之后执行代码
public override void OnResultExecuted(ResultExecutedContext context)
{
// 结果执行后 可以执行的代码
Console.WriteLine("返回结果之后");
}
}
注册过滤器:
通过使用依赖注入的方式,可以在应用程序的任意地方解析和使用这个过滤器。
builder.Services.AddScoped<defaultActionFilter>();
调用过滤器:
可以将过滤器应用到整个控制器或特定的动作方法上。
整个控制器:
特定的动作方法:
[Route("/test")]
[ServiceFilter(typeof(defaultActionFilter))]
[HttpGet]
public async Task<object> Test(string id) {
return id;
}
执行结果:
使用这些方法,您可以在控制器的整个生命周期内插入自定义逻辑,处理验证、授权、异常、结果等。这使得您能够在不干扰业务逻辑的情况下,集中管理各种横切关注点,提高代码的可读性和可维护性。