自学内容网 自学内容网

.NET 6 中,使用 ActionFilterAttribute 实现 AOP(面向切面编程)

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;
        }

 

执行结果:

使用这些方法,您可以在控制器的整个生命周期内插入自定义逻辑,处理验证、授权、异常、结果等。这使得您能够在不干扰业务逻辑的情况下,集中管理各种横切关注点,提高代码的可读性和可维护性。

 

 


原文地址:https://blog.csdn.net/dawfwafaew/article/details/142580074

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!