实现一个基于 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 效果就是可以正常访问:

feature enable

禁用的效果,默认是返回一个 404,如果需要也可以自定义,只需要实现一个接口,注入进去即可

feature disable

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 写一个 GetAppSetting 扩展方法

实现一个基于 IConfiguration 的低配版 FeatureFlag相关推荐

  1. 【Node.js】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)

    引论 simple-socket是我写的一个"低配版"的Web实时通信工具(相对于Socket.io),在参考了相关源码和资料的基础上,实现了前后端实时互通的基本功能 选用了Web ...

  2. java muki_基于canvas和web audio实现低配版MikuTap

    导言 最近发掘了一个特别happy的网页小游戏--MikuTap.打开之后沉迷了一下午,导致开发工作没做完差点就要删库跑路了,还好boss瞥了我一眼就没下文了.于是第二天我就继续沉迷,随着一阵抽搐,这 ...

  3. 一个低配版小恐龙游戏

    用过Chrome的同学应该玩耍过自带的那个小恐龙 无聊的时候刷上一下下倒也是一种消遣 (讲道理打到这个分我都快眼瞎了) 以下正经脸 所以呢我就用Construct 2做个真·低配版吧 既然是低配版那就 ...

  4. typescript用什么软件写_用TypeScript写了个低配版H5美图工具

    前言 最近两月在学习canvas时候,发现很多有意思的技术能力,特别是在图像处理这一领域.让我想起大学课堂教学的<数字图像处理>(冈萨雷斯 版本).但是很遗憾的是,大学上完课应付考试后全部 ...

  5. 谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪?

    [转] https://www.leiphone.com/news/201709/hioiZlgdXIj9fFex.html 雷锋网按:本文作者为 Matt Miesnieks,目前担任 6D.ai ...

  6. 大神解读:谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪?

    转自雷锋网:点击打开链接 原标题:大神解读:谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪? 雷锋网按:本文作者为 Matt Miesnieks,目前担任 6D.ai 的 C ...

  7. 项目:低配版Everything

    一.项目背景     在任何操作系统中,搜索工具都是必不可少的,不管我们多么认真的对文件进行整理,当文件数量非常多时,都可能需要我们花很长时间来找某个文件.搜索工具可以让我们从大量文件中快速找到我们所 ...

  8. 案例:华为FusionInsight_HD 低配版(三台)安装实例 -- 手动安装

    本文为安装华为FusionInsight_HD 低配版(三台)安装实例,给小伙伴们参考: 本文选择三台机器安装,实际安装中发现,不能使用华为给的安装引导文件的(FusionInsight V100R0 ...

  9. 高通骁龙835低配版曝光:代号8997已被骁龙660取代

    今天下午OPPO正式发布了R11/Plus两款手机,在全球首发了高通骁龙660处理器,高通骁龙660与之前几代的高通骁龙6系列64位处理器不同,采用的是高通自主定制的Kryo260八核CPU,架构设计 ...

最新文章

  1. 水电收费系统开发日志(一)
  2. 浏览器中Javascript的加载和执行
  3. 前端学习(2011)vue之电商管理系统电商系统之初步使用upload上传组件
  4. SharedPreferences的使用,android
  5. 后缀数组模板 hdu1403
  6. java gb28181网关_视频网关GB28181协议转换解决方案
  7. C语言-顺序栈的基本操作
  8. 多多客id是什么意思_【拼多多】关于多多客比价行为规范解释说明
  9. 华为云计算IE面试笔记-简述Fusion Storage主要模块MDC,OSD,VBS,FSA及FSM的功能定位及交互关系
  10. 灵魂站队:结婚,男的压力大,还是女的压力大?
  11. 谈谈Web端性能测试
  12. 给discuz x增加后台菜单管理功能
  13. 关于Boost电感的问题
  14. 怎么扫描同网段mac地址linux,如何快速收集局域网内的IP+MAC信息?用这个扫描器分分钟搞定!!!...
  15. 迅雷导出ed2k到eMule链接无效处理
  16. udev规则以及编写
  17. 1181:整数奇偶排序
  18. TODO List -20160602
  19. 【Full text search】检索条件具有完整的关键词布尔逻辑运算AND、OR、NOT能力
  20. java计算机毕业设计养老院管理系统源码+系统+数据库+lw文档

热门文章

  1. IT学习--学习不一定要用在现实工作中
  2. java编译多个包_javac一次性编译多个包下的.java文件
  3. Dispatch Queue 之 Invoke 当前队列
  4. XML与web开发-01- 在页面显示和 XML DOM 解析
  5. 数据库、表、表内容增删改查
  6. HTML标题h,HTML H标题标签
  7. shell中字符串操作【转】
  8. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
  9. spring boot aop 记录方法执行时间
  10. 9 个使用前必须再三小心的 Linux 命令