.Net Core-AOP(Attribute和MiddleWare)

AOP在实际项目中运用的比较多,在日志记录,数据验证,返回值处理等都会涉及,本篇简单概括和记录下AOP的使用和扩展。
 
1.过滤器和中间件的执行顺序
从管道模型图看出,请求开始,首先经过中间件,然后经过过滤器,最终从中间件返回结果。
 
创建一个空WebApi项目,创建过滤器CustomActionFilter.cs和中间件MiddleWareA.cs
 1 public class CustomActionFilter : ActionFilterAttribute
 2 {
 3     public override void OnActionExecuting(ActionExecutingContext context)
 4     {
 5         Console.WriteLine("操作过滤器:执行前");
 6     }
 7     public override void OnActionExecuted(ActionExecutedContext context)
 8     {
 9         Console.WriteLine("操作过滤器:执行后");
10     } 
11 }

 

 1 public class MiddleWareA
 2 {
 3     private readonly RequestDelegate _next;
 4 
 5     public MiddleWareA(RequestDelegate next)
 6     {
 7         _next = next;
 8     }
 9 
10     public async Task Invoke(HttpContext context)
11     {
12         Console.WriteLine("MiddleWareA 开始");
13         await _next.Invoke(context);
14         Console.WriteLine("MiddleWareA 结束");
15     }
16 }

 

在Startup.cs中注入中间件
app.UseMiddleware<MiddleWareA>();

 

结果如下图所示,和管道模型图的流程基本一直。
 
 
在使用多个中间件的时候要注意中间件的执行顺序,先进后出
 

 

2.过滤器和中间件的使用场景

 

 

.Net Core中常用的5种过滤器,都继承了抽象类Attribute,如上图所示
补充模型校验(ValidateAttribute)的使用,详细介绍参考《.Net Core 数据校验Attribute和FluentValidate》
创建NullValidation.cs和模型 ModelTest.cs
 1 public class NullValidation : ValidationAttribute
 2 {
 3     private bool isValidSuccess = true;
 4    
 5 
 6     public override bool IsValid(object value)
 7     {
 8         Console.WriteLine("进入NullValidation");
 9         if (value==null)
10         {
11             isValidSuccess = false; 
12          
13 
14         }
15         return isValidSuccess;
16 
17     }
18 }

 

1 public class ModelTest
2 {
3     [NullValidation]
4     public string Name { get; set; }
5 }

 

控制器中新建方法PostList
 1 [CustomActionFilter]
 2 [HttpPost]
 3 public IEnumerable<WeatherForecast> PostList(ModelTest modelTest)
 4 {
 5     Console.WriteLine("进入PostList");
 6     var rng = new Random();
 7     return Enumerable.Range(1, 5).Select(index => new WeatherForecast
 8     {
 9         Date = DateTime.Now.AddDays(index),
10         TemperatureC = rng.Next(-20, 55),
11         Summary = Summaries[rng.Next(Summaries.Length)]
12     })
13     .ToArray();
14 }

 

运行结果如下图所示:中间件->模型校验->操作过滤器->中间件
 
由此可见,模型校验在接收到参数请求后就会被执行,优先级高于操作过滤器。ValidateAttribute也是继承了Attribute抽象类。如下图所示:
 

 

 

使用场景总结:
Filter使用场景:处理业务相关的内容,如输出结果的格式化,ViewModel数据验证
MiddleWare使用场景:和业务耦合不大的情况下,如身份验证,Session存储,日志记录等
 
以上仅用于学习和总结!
附源码地址:
链接:https://pan.baidu.com/s/1AZRBGw75c3k5ypxrnXzP2g
提取码:ywdn
 
参考地址:

posted @ 2021-02-17 22:52  y_w_k  阅读(1442)  评论(1编辑  收藏  举报