实现一个基于 IConfiguration 的低配版 FeatureFlag
实现一个基于 IConfiguration 的低配版 FeatureFlag
Intro
在我们的应用中,可能有一些配置开关的需求,某些功能是否启用使用一个配置开关,用的时候就打开,不用的时候就关掉,于是基于 .NET Core 的里配置体系写了一个简单的 FeatureFlag,类似于之前的 AppSetting 的扩展 给 IConfiguration 写一个 GetAppSetting 扩展方法
Sample
首先来看一个实现效果:
[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});
}
这是两个完全一样的 API,为了测试 featureFilter 的功能
启用的 API 效果就是可以正常访问:
禁用的效果,默认是返回一个 404,如果需要也可以自定义,只需要实现一个接口,注入进去即可
Implement
实现代码其实也比较简单,分为两部分,一部分是 IConfiguration
的扩展,从配置中获取某个配置开关的值,另外一部分则是 ASP.NET Core 相关的扩展,上面的示例是一个 MVC Filter 的一个示例,比较简单所以我们就直接看代码
IConfiguration
扩展实现代码如下:
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
是一个 MVC 的 ResourceFilter
,实现代码如下:
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
关于 FeatherFlag,上面只是一个简单的封装,微软有一个功能更为丰富的库来支持 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 的低配版 FeatureFlag相关推荐
- 【Node.js】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)
引论 simple-socket是我写的一个"低配版"的Web实时通信工具(相对于Socket.io),在参考了相关源码和资料的基础上,实现了前后端实时互通的基本功能 选用了Web ...
- java muki_基于canvas和web audio实现低配版MikuTap
导言 最近发掘了一个特别happy的网页小游戏--MikuTap.打开之后沉迷了一下午,导致开发工作没做完差点就要删库跑路了,还好boss瞥了我一眼就没下文了.于是第二天我就继续沉迷,随着一阵抽搐,这 ...
- 一个低配版小恐龙游戏
用过Chrome的同学应该玩耍过自带的那个小恐龙 无聊的时候刷上一下下倒也是一种消遣 (讲道理打到这个分我都快眼瞎了) 以下正经脸 所以呢我就用Construct 2做个真·低配版吧 既然是低配版那就 ...
- typescript用什么软件写_用TypeScript写了个低配版H5美图工具
前言 最近两月在学习canvas时候,发现很多有意思的技术能力,特别是在图像处理这一领域.让我想起大学课堂教学的<数字图像处理>(冈萨雷斯 版本).但是很遗憾的是,大学上完课应付考试后全部 ...
- 谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪?
[转] https://www.leiphone.com/news/201709/hioiZlgdXIj9fFex.html 雷锋网按:本文作者为 Matt Miesnieks,目前担任 6D.ai ...
- 大神解读:谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪?
转自雷锋网:点击打开链接 原标题:大神解读:谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪? 雷锋网按:本文作者为 Matt Miesnieks,目前担任 6D.ai 的 C ...
- 项目:低配版Everything
一.项目背景 在任何操作系统中,搜索工具都是必不可少的,不管我们多么认真的对文件进行整理,当文件数量非常多时,都可能需要我们花很长时间来找某个文件.搜索工具可以让我们从大量文件中快速找到我们所 ...
- 案例:华为FusionInsight_HD 低配版(三台)安装实例 -- 手动安装
本文为安装华为FusionInsight_HD 低配版(三台)安装实例,给小伙伴们参考: 本文选择三台机器安装,实际安装中发现,不能使用华为给的安装引导文件的(FusionInsight V100R0 ...
- 高通骁龙835低配版曝光:代号8997已被骁龙660取代
今天下午OPPO正式发布了R11/Plus两款手机,在全球首发了高通骁龙660处理器,高通骁龙660与之前几代的高通骁龙6系列64位处理器不同,采用的是高通自主定制的Kryo260八核CPU,架构设计 ...
最新文章
- 水电收费系统开发日志(一)
- 浏览器中Javascript的加载和执行
- 前端学习(2011)vue之电商管理系统电商系统之初步使用upload上传组件
- SharedPreferences的使用,android
- 后缀数组模板 hdu1403
- java gb28181网关_视频网关GB28181协议转换解决方案
- C语言-顺序栈的基本操作
- 多多客id是什么意思_【拼多多】关于多多客比价行为规范解释说明
- 华为云计算IE面试笔记-简述Fusion Storage主要模块MDC,OSD,VBS,FSA及FSM的功能定位及交互关系
- 灵魂站队:结婚,男的压力大,还是女的压力大?
- 谈谈Web端性能测试
- 给discuz x增加后台菜单管理功能
- 关于Boost电感的问题
- 怎么扫描同网段mac地址linux,如何快速收集局域网内的IP+MAC信息?用这个扫描器分分钟搞定!!!...
- 迅雷导出ed2k到eMule链接无效处理
- udev规则以及编写
- 1181:整数奇偶排序
- TODO List -20160602
- 【Full text search】检索条件具有完整的关键词布尔逻辑运算AND、OR、NOT能力
- java计算机毕业设计养老院管理系统源码+系统+数据库+lw文档