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.pswp.cn/news/286737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286737.shtml
英文地址,請注明出處:http://en.pswp.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%…