实现一个基于 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,一经查实,立即删除!

相关文章

矩阵键盘逐行扫描C语言,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf...

(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf/******************************************************************//* 名称&#xff1a;矩阵键盘逐行扫描法 *//* 作者&#xff1a;苏涛 *//* 时间&#xff1a;2011-01-15 *//* 单位&#xf…

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;还是地狱的使者没人…

[转载]学习让测试更精彩,测试让生命更精彩

其实&#xff0c;这篇文章的名字我想了很久&#xff0c;最终定了这样一个标题。很多人会觉得太大了吧&#xff0c;学习和测试有关系&#xff0c;测试和生命的关联貌似没有那么大吧。其实不然&#xff0c;这篇文章提到的一种态度&#xff0c;是一种思想&#xff0c;是一种精神。…

如何分析 StackOverflow 异常 ?

一般来说&#xff0c;当你的方法递归调用次数太多大于线程栈的默认1M内存时将会抛出 StackOverflowException 异常。举个例子&#xff0c;假设你有下面这段代码&#xff1a;using System;namespace temp {class Program{static void Main(string[] args){Main(args); // Oops, …

PHP json_encode() 函数介绍

在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。 这个函数的功能是将数值转换成json数据存储格式。 view source print?01<?php 02$arr array03 ( 04 Name>希亚, 05 Age>2…

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

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

c语言逆序数输三个数,C语言求助!一个三位数的逆序数,总是编不对

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include int main(){int n,a,b,c,sum,ge,shi,bai;printf("请输入一个三位整数&#xff1a;\n");scanf("%d",&n);nfabs(n);an/100;b(n-a*100)/10;cn%10;if(a>b&&b>c){gec…

不让伤害再次发生

不让伤害再次发生我是英特尔成都工厂的第二批员工,在上海工厂学习培训之后,于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…

【慢慢学算法】:查找第k小数

题目描述&#xff1a;查找一个数组的第K小的数&#xff0c;注意同样大小算一样大。 如 2 1 3 4 5 2 第三小数为3。 输入&#xff1a;输入有多组数据。每组输入n&#xff0c;然后输入n个整数(1<n<1000)&#xff0c;再输入k。 输出&#xff1a;输出第k小的整数。 样例输入…

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

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

linux 压缩成bz2,linux 将文件压缩成bz2格式 命令:bzip2

bzip2命令用于创建和管理(包括解压缩)“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种&#xff0c;以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&#xff0c;相信大家看完后会有很多收获。语法bzip2 (选项 ) (参数)选项-c或——stdout&am…

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

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

Android去掉顶部的阴影

首先定义一个style <style name"Theme.IOSched" parent"android:style/Theme.Light"> <item name"android:windowNoTitle">true</item><item name"android:windowContentOverlay">null</item></sty…

.NET 基金会项目介绍 - ReactiveUI

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

NPOI 删除指定的行

http://jiajietieren.blog.163.com/blog/static/60186942201261673517542/转载于:https://www.cnblogs.com/ajie1212/archive/2012/07/16/2594125.html

最具体的历史centos下一个 postfix + extmail + dovecot + maildrop 安装注意事项2014更新...

这篇文章原本是2008年发表的&#xff0c;近期几天照此笔记又安装了一遍系统。这里更新一下记录。作者&#xff1a;wangdy本文发表于 http://blog.csdn.net/aryang/article/details/40593283 转载请注明&#xff01;1. 概述 安装环境是CentOS6.5&#xff0c;拿到server的时候仅…