.netcore的AOP讲解(二)

141 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

前言

今天我们继续.netCore的AOP面向切面编程的讲解,本篇文章主要讲的是IResultFilter,IAsyncResultFilte,ActionFilter,Filter的多种注册以及 匿名支持的内容,让我们一起来看看吧!

IResultFilter扩展

ASP.NET Core6提供的是接口IResultFilter/IAsyncResultFilter/ActionFilterAttribute

可以自定义扩展也可以直接使用

通过一个特性的支持

开始实操 ---扩展

执行顺序

IResultFilter场景应用

在渲染视图和结果的时候,做结果的统一处理

JSON格式的统一处理

IAsyncResultFilte扩展 应用场景

新增类

实现IAsyncResultFilter接口--实现方法实现统计JSON结果

框架提供的ActionFilter扩展定制

包含了ActionFilter和ResultFilter的多种实现

开始扩展定制

特点区别

同步异常的执行特点---如果实现ActionFilterAttribute抽象父类,在执行的时候, 只会执行异步版本的方法---在源码中他是直接判断了,如果有异步版本,同步版本就不执行了

AlwaysRunResultFilter扩展定制

在之前讲过的ActionFilter/ResourceFilter中只要是对HttpContext.Result赋值,就不再继续往后了。

如果在ResourceFilter处理后,HttpContext赋值后,也想在后面来一个补充呢?

开始扩展AlwaysRunResultFilter

新增类,继承Attribute、实现IAlwaysRunResultFilter接口

实现方法

注册到Action上

测试

Filter的多种注册

AOP:在不修改之前的代码为基础上,动态增加功能,但是我们现在做的无论是ResourceFilter还是ActionFilter都是直接标记在方法上的,那么如果要对某一些Action、或者对于某个项目整体生效呢?

方法注册:仅对当前方法生效

控制器(类)注册:对当前控制器下的所有Action都生效

全局注册:对于项目中的所有方法都生效

builder.Services.AddControllersWithViews(
     mvcOptions =>{
         mvcOptions.Filters.Add<...>();
     }
)

匿名支持

单个Action注册是对于某一个Action生效

但是控制器、全局注册都是生效一大片! 那么在这样生效一部分的时候。总有"误伤";

如果希望在全局或者控制器注册后,其中有部分Action不生效呢? 匿名

系统提供了AllowAnonymousAttribute,有部分可以使用,有部分不能直接使用

扩展IResourceFilter--不能直接使用AllowAnonymousAttribute-需要扩展支持扩展IActionFilter--不能直接使用AllowAnonymousAttribute-需要扩展支持 扩展IResultFilter--不能直接使用AllowAnonymousAttribute-需要扩展支持

如果要使用,则在自定义的特性方法上进行判断,

举例:

//customAttribute.cspublic void OnResourceExcuting (ResourceExcuting context)
{
    //如果要执行这个匿名,就在这里进行一下逻辑判断
  //context.ActionDescriptor.EndPointMetadata包含了要访问的Action上或者当前Action控制器上的标记的特性
    if(context.ActionDescriptor.EndPointMetadata.Any(c=>c.GetType().Equals(typeof(CustomAllowAnoymousAttribute))))
    {
        return;
    }
    
}
​

总结:今天的.netcore内容就是这一些,明天继续更一更,一步步来,加油!