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

bd29d3d6c4e2f419d3e431553b1e5bb7.png
feature enable

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

bcb5b80b6441d29fbbd3ea4d3ceb324c.png
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 扩展方法

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

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

相关文章

slider节点透明背景_【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)...

一、涉及知识点场景切换按钮事件监听节点事件监听节点数组循环中闭包的应用动态更换sprite图片定时器预制资源二、步骤2.1 准备工作首先&#xff0c;我们要新建一个空白工程&#xff0c;并在资源管理器中新建几个文件夹​在这些文件夹中&#xff0c;我们用来存放不同的资源&…

《奠基计算机网络》清华大学出版社 之 IPv6和IPv4共存技术

2011年8月 ISATAP隧道 ISATAP &#xff08; Intra-Site Automatic Tunnel Addressing Protocol&#xff0c;站间自动隧道寻址协议&#xff09;是一种地址分配和主机到主机、主机到路由器和路由器到主机的自动隧道技术.它为IPv6主机之间提供了跨越IPv4内部网络的单播IPv6连通性。…

霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...

全世界只有3.14 % 的人关注了爆炸吧知识科学“赌徒”在线发牌 一直以来他像一个深渊的幽灵&#xff0c;似乎无处不在他影响了无数的天体&#xff0c;却又无影无踪他永远只停留在人们的推断真实的图像&#xff0c;交错的数据他究竟是神仙的化身&#xff0c;还是地狱的使者没人…

小波变换原理_小波变换的知识,转载的

一、绘制原理&#xff1a;需要用到的小波工具箱中的三个函数cwt()&#xff0c;centfrq()&#xff0c;scal2frq()。具体参数及用途介绍如下&#xff1a;&#xff08;1&#xff09;COEFS cwt(S,SCALES,wname)该函数实现连续小波变换&#xff0c;其中S为输入信号&#xff0c;SCAL…

不让伤害再次发生

不让伤害再次发生我是英特尔成都工厂的第二批员工,在上海工厂学习培训之后,于2005 年加入到成都封装测试工厂的启动和生产工作中,到2010 年,我已经在成都工厂工作了五年半。在这五年半时间里,我始终在封装工程部任工程师,负责站点的设备、工艺和质量,确保站点按照相关计划和流程…

撩妹学会这一招,就没有人能拒绝你!

1 为了恋爱学会了 PS&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 二十不惑&#xff0c;手很迷惑▼3 怀疑家里的猫是「人变的」&#xff08;via.七七和铲屎官&#xff09;▼4 云南人有多喜欢吃菌子&#xff08;via.车夫&#xff09;&#xff08;请勿模仿&…

Javascript:阻止浏览器默认右键事件,并显示定制内容

在逛一些知名图片社区的时候&#xff0c;遇到自己心怡的图片&#xff0c;想要右键另存的时候&#xff0c;默认的浏览器菜单不见了&#xff0c;却出现了如&#xff1a;[©kevin版权所有]之类的信息&#xff1b; 今天在看Javascript事件默认行为相关的知识&#xff0c;所以&a…

Dapr + .NET 实战(十三)跨语言开发

欢迎大家参加4小时Dapr.NET 5的实战课程课程链接 https://ke.qq.com/course/4000292?tuin1271860f因为基于Dapr的服务架构是不限语言的&#xff0c;我们来看看Dapr的跨语言开发。我们使用golang&#xff0c;python&#xff0c;.NET来实现跨语言的服务调用&#xff0c;拓扑…

飞机上的排泄物都去哪里了?直接冲下来?

全世界只有3.14 % 的人关注了爆炸吧知识火车想必大家都知道&#xff0c;上完厕所&#xff0c;来也冲冲&#xff0c;去也冲冲&#xff0c;直接拥抱大地&#xff01;所以进站都会锁厕所门~那么飞机上也是这样吗&#xff1f;飞机上早期的厕所 早期&#xff0c;飞机上的马桶和普通…

.NET 基金会项目介绍 - ReactiveUI

ReactiveUI 是属于 .Net 基金会的一个项目&#xff0c;本文将简要介绍该项目相关的信息。中文介绍中文介绍内容翻译自英文介绍&#xff0c;主要采用意译、如与原文存在出入&#xff0c;请以原文为准。ReactiveUIReactiveUI 是一个可用于所有 .Net 平台的可组合的 MVVM 框架&…

史上最强悍的一张图,没有任何一个中国人能躲得开!

▲ 点击查看几乎每个家庭都会有两张地图&#xff1a;一张世界地图&#xff0c;一张中国地图。薄薄的两张纸&#xff0c;蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长&#xff0c;也是300多年来唯一一位女校长德鲁吉尔平福斯特&#xff08;Drew Gilpin Faust&#x…

Dapr牵手.NET学习笔记:可观测性-分布式跟踪

分布式跟踪在dapr里是开箱即用的&#xff0c;不需要对应用作任何一丁点的侵入式编程。之前的开发&#xff0c;如果想实现分式跟踪&#xff0c;就得在应用中埋点&#xff0c;这是一个与业务无关系的动作。dpar通过sidecar可以轻松做到这点&#xff0c;从而让程序员更多精力投入到…

Android带三角形的弹窗,Android实现三角形气泡效果方式汇总

在开发过程中&#xff0c;我们可能会经常遇到这样的需求样式&#xff1a;这张图是截取京东消息通知的弹出框&#xff0c;我们可以看到右上方有个三角形的气泡效果&#xff0c;这只是其中一种&#xff0c;三角形的方向还可以是上、下、左、右。通过截图可以发现&#xff0c;气泡…

GDI+ 设置文本对齐方式

可通过以下语句来设置文本的对齐方式&#xff1a;StringFormat sF new StringFormat()sF.Alignment StringAlignment.Far; sF.LineAlignment StringAlignment.Far;代码&#xff1a;、View Code privatevoidForm1_Paint(objectsender, PaintEventArgs e) { …

微服务组件记事本:本地搭建Skywalking

最近一直在研究微服务&#xff0c;完全避免不了的是各种中间件的使用&#xff0c;打算把过程简要记录下来&#xff0c;过程很简单&#xff0c;也不会有原理和源代码级别的讲解&#xff0c;只是做下简单的知识备份。今天开始研究下链路追踪Skywalking&#xff0c;还记得之前在《…

马斯克发布脑机接口重大突破:蓝牙连接,一小时植入,已获FDA认证,人体实验在即...

全世界只有3.14 % 的人关注了爆炸吧知识综合整理自&#xff1a;机器之心、量子位、智东西编辑&#xff1a;知识君伊隆 马斯克神秘的脑机接口公司 Neuralink&#xff0c;终于向人们展示了自己首款可以「进入人体」的产品。今日&#xff0c;在 Neuralink 总部的发布会活动上&…

如何在android客户端中做到自动检查数据更新?,UpdateHelper

软件简介UpdateHelper 是一个为了简化Android App的迭代升级开发的AndroidLibrary&#xff0c;任何一个项目只要引入这个library便集成了在线检查新版本的功能以及下载APK功能&#xff0c;仅需两行代码即可搞定。UpdateHelpers要怎么使用&#xff1f;1.首先服务器端需要提供一个…

【另类见解】那些要保证缓存和数据库数据一致性的最后怎么了?

“现在如果说不出几句如何保证数据一致性方案的话&#xff0c;觉得出去面试都丢人,尤其是缓存和数据库的数据一致性“全程无图&#xff0c;请谨慎阅读缓存对于程序性能而言&#xff0c;无疑是个杀手锏&#xff0c;但不是完美的解决方案。关键在于缓存的物理位置和数据真实保存的…

3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的大人孩子~

全世界只有3.14 % 的人关注了爆炸吧知识宇宙深邃美丽&#xff0c;是黑夜的荧光&#xff0c;是夏天里冒着凉气的西瓜&#xff0c;总是诱人地勾起一代又一代人探索的欲望。对于宇宙思索与探索&#xff0c;人类的脚步从未停止。正是人类对宇宙的好奇&#xff0c;撑起了人类发展的大…

我的Java开发学习之旅------Base64的编码思想以及Java实现

Base64是一种用64个字符来表示任意二进制数据的方法。 用记事本打开exe、jpg、pdf这些文件时&#xff0c;我们都会看到一大堆乱码&#xff0c;因为二进制文件包含很多无法显示和打印的字符&#xff0c;所以&#xff0c;如果要让记事本这样的文本处理软件能处理二进制数据&#…