Action过滤器重构

注:本文参照 NickChapsas的Attributes get a feature long-overdue in C# 11

今天看一个泛型特性的例子,这个功能在C#11才受支持。

在asp.net core mvc中,可以给action添加filter,达到拦截作用,实现如下:

public class MyFilter : IAsyncActionFilter
{public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){Console.WriteLine("Action前执行");await next();Console.WriteLine("Action后执行");}
}

使用方式,在Action上添加ServiceFilter特性即可,如下:

[ServiceFilter(typeof(MyFilter))]       
public IEnumerable<WeatherForecast> Get()
{return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();
}

在运行前记得把MyFilter注放到Service容器中:

builder.Services.AddScoped<MyFilter>();

为了支持C#11,在项目文件.csproj中,PropertyGroup中添加一行<LangVersion>preview</LangVersion>

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net7.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><LangVersion>preview</LangVersion></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0-preview.4.22251.1" /><PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.1" /></ItemGroup>
</Project>

现在就可以定义一个继承IFilterFactory的特性类了,并且是泛型的。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class GSWFilterAttribute<TFilter> : Attribute, IFilterFactory, IOrderedFilter where TFilter : IAsyncActionFilter
{public bool IsReusable { get; set; }public int Order { get; set; }public IFilterMetadata CreateInstance(IServiceProvider serviceProvider){if (serviceProvider != null){var filter = (IFilterMetadata)serviceProvider.GetRequiredService(typeof(TFilter));if (filter is IFilterFactory filterFactory){filter = filterFactory.CreateInstance(serviceProvider);}return filter;}else{throw new ArgumentNullException(nameof(serviceProvider));}}
}

使用时,直接把泛型类型放上就可以了,如下:

[GSWFilter<MyFilter>]
public IEnumerable<WeatherForecast> Get()
{return Enumerable.Range(1, 5).Select(index => new WeatherForecast{ Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();
}

虽然两种方法实现的功能是一样的,但后一种看起来更优雅一些。同时说明一下,如果多个MyFilter功能的过滤器,可以增加Order属性,如下:

[GSWFilter<MyFilter1>(Order = 2)]
[GSWFilter<MyFilter2>(Order = 1)]
public IEnumerable<WeatherForecast> Get()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

征集对Oracle的问题

两月前收到Oracle的邀请&#xff0c;10.10-16日参加在旧金山举办Oracle Open World 2009&#xff0c;旅程连上了长假。很荣幸&#xff0c;我是中国惟一入选的博客&#xff08;感谢小松and北北&#xff0c;还有小废物同学经年累月的鞭策和诱导&#xff0c;北北同学的诱导尤其受用…

一篇文学会商用可编辑问卷表单制作【iVX 十二】

公共表单 在 iVX 快速教程中&#xff0c;我们使用一个公共表单项目作为 WebApp 应用的演示说明。公共表单项目可以用于企业内部或一个问卷公共平台做问卷调查&#xff0c;用户可以自由的设置表单元素以及样式&#xff0c;并且可以手动设置表单结束下载填写问卷后的调查数据。 …

【地图学】地图投影的定义和分类

一、地图投影 1、地图投影的定义 地图投影是利用一定数学法则把地球表面的经、纬线转换到平面上的理论和方法。 2、地图投影的分类 (1)按变形性质 • 等角投影: 投影面上两微分线段的夹角与地面上的相应两线段的夹角相等,及没有角度变形的投影叫 ~ 。

React-引领未来的用户界面开发框架-读书笔记(八)

第16章 架构模式 React主要功能在于渲染HTML。可以将其看成是MVC中的V&#xff0c;它不会影响到组件中直接调用AJAX请求之类的操作&#xff1a; var TakeSurveyReact.CreateClass({getInitialData&#xff1a;function(){return{survey:null}&#xff1b;},componentDidMount:…

三)mybatis 二级缓存,整合ehcache

mybatis-config.xml <setting name"cacheEnabled" value"true" /> PersonMapper.xml <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http:…

confluence5.8.10的使用

之前在windows上安装了confluence5.8.10,结果有一天知什么缘故&#xff0c;数据库数据损坏&#xff0c;知识库彻底打不开了&#xff0c;所有的文档都付之东流&#xff0c;真的不是一般心痛。因此考虑将其装到linux机器上&#xff0c;因为tomcat和mysql实际上都为了linux而生的&…

Android之提示Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider

1 问题 接入SDK提示错误如下 java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: 2 解决办法 在AndroidManifest.xml文件下面配置如下 在application目录下面配置如下&#xff0c;…

RPA之PAD(Power Automate Desktop)组件开发

本文由网友蓝创精英团队投稿&#xff0c;欢迎转载、分享原文作者&#xff1a;蓝创精英团队原文链接&#xff1a;https://blog.csdn.net/i2blue/article/details/125040323其实&#xff0c;PAD&#xff0c;现在官方文档还没有对外组件式或者插件式开发接口。但是&#xff0c;有一…

【地图学】高斯-克吕格(Gauss-Kruger)投影原理、应用详解(3°带、6°带)

一、高斯克吕格投影概述 德国数学家、物理学家、天文学家高斯于19 世纪20 年代拟定,后经德国大地测量学家克吕格于1912 年对投影公式加以补充,故称为高斯-克吕格投影(Gauss-Kruger,简称GK),又名"等角横切椭圆柱投影”。中央经线和赤道投影为相互垂直的直线,其它经线…

Linux安装 微信开发者工具(deepin linux ubt)

一.环境:: deepin linux15.4.1 二.安装过程: 2.1 安装wine sudo apt-get install wine 2.2 安装nwjs-sdk 2.2.1 下载linux版nwjs-sdk wget https://dl.nwjs.io/v0.25.4/nwjs-sdk-v0.25.4-linux-x64.tar.gz 2.2.2 解压nwjs-sdk tar xvf nwjs-sdk-v0.25.4-linux-x64.tar.gz 2.2…

Python 3.6学习笔记(一)

开始之前 基础示例 Python语法基础&#xff0c;python语法比较简单&#xff0c;采用缩紧方式。 # print absolute value of a integer a 100 if a > 0:print(a) else:print(-a) 可以看到&#xff0c;注释以#开头&#xff0c;python的变量不需要任何前缀&#xff0c;行结束不…

小程序的 HelloWord 01《 程序员变现指南之 微信QQ 小程序 真的零基础开发宝典》

本系列教程是针对粉丝的变现教程&#xff0c;还不是粉丝的可以关注我并且到社区&#xff1a;https://bbs.csdn.net/topics/603436232 进行打卡&#xff0c;不是老粉的也可以获取最终的技术变现学习&#xff0c;最终还有详细的变现教程等你来。 前言 《 程序员变现指南之 微信…

octave中的一些基本操作

1.矩阵的表示&#xff1a;v [1 2 2] %表示1行3列的矩阵 v [1; 2; 2] %表示3行1列的矩阵 v [1 2; 2 3; 4 5] %3*2矩阵 size(v) % 求v的行与列 length(v) %求v的列 2.几个基本矩阵的表示&#xff1a;1&#xff09;s ones(2, 4) %2*4全1矩阵 2&#xff09;m zeros(3, 4) %3…

Docker 日志最佳实践

当运行在 docker 容器中的应用程序打印日志时&#xff0c;日志会输出到标准输出流 stdout 和标准错误流 stderr。容器日志驱动可以访问这些流&#xff0c;并将日志发送到文件、本机运行的日志收集器或远端的日志服务端点&#xff08;endpoint&#xff09;。本文将介绍选择不同的…

Android之提示A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

1 问题 编译项目的时候提示错误如下 A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution 2 原因 有2次我写room数据库的时候都提示这个 ColumnInfo(name "isAddBookmark")var isAddBookmark falseColumnInfo(name "…

一个获取a标签传值的函数

//获取url查询参数 var getUrlParams function () {var href"",params;return function (key,url) {if(url) {href url;params null;} else if(!url && !href) href window.location;//console.log(href);if(!params) {params {};var search href.sea…

【大地信】新时代GIS发展趋势与未来展望

一、你必须知道的国内外知名学者 1. RogerTomlinson(罗杰汤姆林森)---GIS之父 Roger Tomlinson从1963年开始创建世界上第一个地理信息系统,即加拿大地理信息系统(CGIS)。因此,Tomlinson被誉为地理信息系统之父。 RogerTomlinson(1933.12---2014.2.9) 2. Michael Fran…

Python3.6学习笔记(二)

Python 的高级特性 切片 对于指定索引范围取值的操作&#xff0c;Python提供了slice方法&#xff0c;类似于Excel中数据透视表的切片器。 >>> L [Michael, Sarah, Tracy, Bob, Jack’] #声明一个List&#xff0c;取前三个值 >>> L[0:3] #表示从0开始&…

小程序获取头像试试水 02《 程序员变现指南之 微信QQ 小程序 真的零基础开发宝典》

本系列教程是针对粉丝的变现教程&#xff0c;还不是粉丝的可以关注我并且到社区&#xff1a;https://bbs.csdn.net/topics/603436232 进行打卡&#xff0c;不是老粉的也可以获取最终的技术变现学习&#xff0c;最终还有详细的变现教程等你来。 前言 《 程序员变现指南之 微信…

VNX NETAPP NAS 备份恢复

做多少次快照的时间是自定义 的&#xff0c;例如可以每隔4小时做一次。 例如有A&#xff0c;B&#xff0c;C&#xff0c;D四个文件。 1&#xff09;第一次快照&#xff08;COW&#xff09;&#xff1a; 快照是瞬时的&#xff0c;拍照时候创建了一个快照空间&#xff0c;例如20%…