日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现一个基于 IConfiguration 的低配版 FeatureFlag

發(fā)布時(shí)間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现一个基于 IConfiguration 的低配版 FeatureFlag 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)現(xiàn)一個(gè)基于 IConfiguration 的低配版 FeatureFlag

Intro

在我們的應(yīng)用中,可能有一些配置開關(guān)的需求,某些功能是否啟用使用一個(gè)配置開關(guān),用的時(shí)候就打開,不用的時(shí)候就關(guān)掉,于是基于 .NET Core 的里配置體系寫了一個(gè)簡單的 FeatureFlag,類似于之前的 AppSetting 的擴(kuò)展?給 IConfiguration 寫一個(gè) GetAppSetting 擴(kuò)展方法

Sample

首先來看一個(gè)實(shí)現(xiàn)效果:

[HttpGet("[action]")] [FeatureFlagFilter("Flag1",?DefaultValue?=?true)] public?IActionResult?FeatureEnableTest() {return?Ok(new{Time?=?DateTime.UtcNow}); }[HttpGet("[action]")] [FeatureFlagFilter("Flag2",?DefaultValue?=?false)] public?IActionResult?FeatureDisableTest() {return?Ok(new{Time?=?DateTime.UtcNow}); }

這是兩個(gè)完全一樣的 API,為了測試 featureFilter 的功能

啟用的 API 效果就是可以正常訪問:

feature enable

禁用的效果,默認(rèn)是返回一個(gè) 404,如果需要也可以自定義,只需要實(shí)現(xiàn)一個(gè)接口,注入進(jìn)去即可

feature disable

Implement

實(shí)現(xiàn)代碼其實(shí)也比較簡單,分為兩部分,一部分是 IConfiguration 的擴(kuò)展,從配置中獲取某個(gè)配置開關(guān)的值,另外一部分則是 ASP.NET Core 相關(guān)的擴(kuò)展,上面的示例是一個(gè) MVC Filter 的一個(gè)示例,比較簡單所以我們就直接看代碼

IConfiguration 擴(kuò)展實(shí)現(xiàn)代碼如下:

public?static?string?FeatureFlagsSectionName?=?"FeatureFlags";public?static?bool?TryGetFeatureFlagValue(this?IConfiguration?configuration,?string?featureFlagName,?out?bool?featureFlagValue) {featureFlagValue?=?false;var?section?=?configuration.GetSection(FeatureFlagsSectionName);if?(section.Exists()){return?bool.TryParse(section[featureFlagName],?out?featureFlagValue);}return?false; }public?static?bool?IsFeatureEnabled(this?IConfiguration?configuration,?string?featureFlagName,?bool?defaultValue?=?false) {if?(TryGetFeatureFlagValue(configuration,?featureFlagName,?out?var?value)){return?value;}return?defaultValue; }

上面示例中的 FeatureFlagFilter 是一個(gè) MVC 的 ResourceFilter,實(shí)現(xiàn)代碼如下:

public?interface?IFeatureFlagFilterResponseFactory {public?Task<IActionResult>?GetResponse(ResourceExecutingContext?resourceExecutingContext); }[AttributeUsage(AttributeTargets.Class?|?AttributeTargets.Method,?AllowMultiple?=?false,?Inherited?=?true)] public?sealed?class?FeatureFlagFilterAttribute?:?Attribute,?IAsyncResourceFilter {public?bool?DefaultValue?{?get;?set;?}public?string?FeatureFlagName?{?get;?}public?FeatureFlagFilterAttribute(string?featureFlagName){FeatureFlagName?=?featureFlagName????throw?new?ArgumentNullException(nameof(featureFlagName));}public?async?Task?OnResourceExecutionAsync(ResourceExecutingContext?context,?ResourceExecutionDelegate?next){var?configuration?=?context.HttpContext.RequestServices.GetRequiredService<IConfiguration>();if?(configuration.IsFeatureEnabled(FeatureFlagName,?DefaultValue)){await?next();}else{var?responseFactory?=?context.HttpContext.RequestServices.GetService<IFeatureFlagFilterResponseFactory>();if?(responseFactory?!=?null){context.Result?=?await?responseFactory.GetResponse(context);}else{context.Result?=?new?NotFoundResult();}}} }

More

關(guān)于 FeatherFlag,上面只是一個(gè)簡單的封裝,微軟有一個(gè)功能更為豐富的庫來支持 Microsoft.FeatureManagement.AspNetCore,? 源代碼在 Github 上有需要的可以參考?https://github.com/microsoft/FeatureManagement-Dotnet

以上示例代碼可以從 Github 獲取:https://github.com/WeihanLi/WeihanLi.Web.Extensions/blob/dev/samples/WeihanLi.Web.Extensions.Samples/ValuesController.cs

References

  • https://github.com/WeihanLi/WeihanLi.Web.Extensions/blob/dev/samples/WeihanLi.Web.Extensions.Samples/ValuesController.cs

  • https://github.com/WeihanLi/WeihanLi.Web.Extensions/blob/dev/src/WeihanLi.Web.Extensions/Middleware/FeaturedMiddleware.cs

  • https://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Extensions/ConfigurationExtension.cs#L131

  • https://github.com/microsoft/FeatureManagement-Dotnet

  • https://www.nuget.org/packages/Microsoft.FeatureManagement.AspNetCore/

  • 給 IConfiguration 寫一個(gè) GetAppSetting 擴(kuò)展方法

總結(jié)

以上是生活随笔為你收集整理的实现一个基于 IConfiguration 的低配版 FeatureFlag的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。