.net core 不启用 https_.NET 应用如何优雅的做功能开关(Feature Flag)
點擊上方藍(lán)字關(guān)注“汪宇杰博客”
導(dǎo)語
曾經(jīng),我們要在應(yīng)用程序里做功能開關(guān),就避免不了在配置文件里加上一堆 bool 類型的配置項,然后在代碼里用 if else 去判斷。盡管這種做法是可行的,但我們現(xiàn)在有辦法讓代碼更加整潔,避免成堆的 if else 出現(xiàn)。
.NET 功能管理庫
微軟為了解決常見的功能開關(guān)問題場景,推出了 .NET Core Feature Management 庫。它由 Azure 團(tuán)隊發(fā)布,并屬于 Azure 文檔的一部分,但我發(fā)現(xiàn)就算在沒有 Azure 環(huán)境的情況下,它依然可以正常全功能運(yùn)行!
Azure 在此的作用僅僅是用 Azure App Configuration 作為功能開關(guān)的數(shù)據(jù)源,而我們完全可以用本地的 appsettings.json 來替代,避免了購買 Azure 從而落魄街頭的風(fēng)險。
安裝功能管理庫
以我的博客系統(tǒng)為例,我的應(yīng)用是 ASP.NET MVC / Web API類型的,我需要添加的包為?Microsoft.FeatureManagement.AspNetCore。如果你的應(yīng)用并非ASP.NET,可以只添加?Microsoft.FeatureManagement
然后注冊到 DI 里去
using Microsoft.FeatureManagement;
public class Startup
{
? ? public void ConfigureServices(IServiceCollection services)
? ? {
? ? ? ? services.AddFeatureManagement();
? ? }
}
添加功能開關(guān)配置項
以我的博客系統(tǒng)為例,原先我在 AppSettings section 中有兩個bool類型的配置項,現(xiàn)在就可以遷移到名為?FeatureManagement 的新 section 里。
相對應(yīng)的,在 C# 代碼里,去掉原來的項,添加一個新的枚舉類型,值的名稱對應(yīng)配置項的名稱。
這個枚舉類型不是必須的,但非常建議創(chuàng)建枚舉,這是為了保證在使用功能開關(guān)的時候有強(qiáng)類型支持,避免用string導(dǎo)致哪里名字沒改對造成996。
使用功能開關(guān)
我們只需從DI里拿到 IFeatureManager 的實例,即可判斷功能開關(guān)是否打開。例如:
IFeatureManager featureManager;
...
if (await featureManager.IsEnabledAsync(nameof(MyFeatureFlags.FeatureA)))
{
? ? // 執(zhí)行代碼
}
在 ASP.NET 項目里,最方便的就是通過構(gòu)造函數(shù)獲取?IFeatureManager 的實例
public class HomeController : Controller
{
? ? private readonly IFeatureManager _featureManager;
? ? public HomeController(IFeatureManager featureManager)
? ? {
? ? ? ? _featureManager = featureManager;
? ? }
}
那么問題來了,說好的少寫 if else 呢?這個 IsEnabledAsync 不還是得寫 if?
其實 Microsoft.FeatureManagement.AspNetCore 這個包包括了 MVC / Web API 項目所需要用到的許多助手功能。可以讓我們避免大量的 if else。
在 Controller 級別添加功能開關(guān)
還是以我博客系統(tǒng)為例,我的 GraphController 只有在 EnableWebApi 開關(guān)打開的時候才響應(yīng)用戶請求,那么本來的 if else 判斷現(xiàn)在就可以:
[FeatureGate(FeatureFlags.EnableWebApi)]
// ...?
public class GraphController : ControllerBase?
{
// ...
}
是不是很爽?
在 Action 級別添加功能開關(guān)
[FeatureGate(FeatureFlags.EnableAudit)]
public async Task ClearAuditLogs()
{
? ? // ...
}
在 View 上添加功能開關(guān)
先在?_ViewImports.cshtml 中添加 taghelper 聲明。
@addTagHelper *, Microsoft.FeatureManagement.AspNetCore
然后就可以用? 標(biāo)簽選擇性的渲染 HTML 內(nèi)容了!
? ?
This can only be seen if 'FeatureA' is enabled.
對于feature關(guān)閉才顯示的內(nèi)容,加個 negate 就好了
? ?
This will be shown if 'FeatureA' is disabled.
還可用? All, Any 屬性控制多個功能開關(guān)的顯示處理。All 表示列出的功能得全啟用才執(zhí)行,Any 表示列出的功能里任意一個為 true 就可以執(zhí)行。
This can only be seen if 'FeatureA' and 'FeatureB' are enabled.
This can be seen if 'FeatureA', 'FeatureB', or both are enabled.
根據(jù)功能開關(guān)添加 Filter
使用?AddForFeature() 拓展方法
using Microsoft.FeatureManagement.FeatureFilters;
IConfiguration Configuration { get; set;}
public void ConfigureServices(IServiceCollection services)
{
? ? services.AddMvc(options => {
? ? ? ? options.Filters.AddForFeature(nameof(MyFeatureFlags.FeatureA));
? ? });
}
根據(jù)功能開關(guān)添加 Middleware
app.UseMiddlewareForFeature(nameof(MyFeatureFlags.FeatureA));
或者
app.UseForFeature(featureName, appBuilder => {
? ? appBuilder.UseMiddleware();
});
小提示
功能開關(guān)的配置值更改,無需重啟應(yīng)用程序,修改配置文件后可以熱更新,立即生效!
另外,如果你足夠有錢,也推薦試試 Azure App Configuration,將你的應(yīng)用功能開關(guān)放在云端統(tǒng)一管理,可以非常方便的針對用戶群體配置 A/B,藍(lán)綠測試哦!
參考文檔:https://docs.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core?WT.mc_id=AZ-MVP-5002809
汪宇杰博客
Azure | .NET |?微軟 MVP
無廣告,不賣課,做純粹的技術(shù)公眾號
喜歡本篇內(nèi)容請點個在看
總結(jié)
以上是生活随笔為你收集整理的.net core 不启用 https_.NET 应用如何优雅的做功能开关(Feature Flag)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 622841开头是什么银行的卡
- 下一篇: 西瓜视频怎么投屏到电视上(高清免费在线视