• .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
     
    参考地址:

  • 相关阅读:
    linux虚拟机系统的复制或克隆后续问题解决!
    Linux命令大全
    Linux 介绍快速浏览
    Linux软件管理和安装
    Kali linux 2016.2(Rolling)安装之后的常用配置
    使用ttXactAdmin、ttSQLCmdCacheInfo、ttSQLCmdQueryPlan获取SQL相关具体信息[TimesTen运维]
    MongoDB--Getting Started with Java Driver
    OpenCV 通过 MFC 的 Picture Control 控件操作图像
    HTML学习笔记之中的一个(input文件选择框的封装)
    hdu 5282 Senior&#39;s String 两次dp
  • 原文地址:https://www.cnblogs.com/ywkcode/p/14410127.html
Copyright © 2020-2023  润新知