.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 ModelTest2 {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 参考地址:https://www.cnblogs.com/ywkcode/p/13737092.htmlhttps://www.cnblogs.com/viter/p/10107886.html