50  
netcore
 
RU EN
Apr 22, 2024

Feature Flags in .NET Core

Feature Flags in .NET Core
Автор:
Источник:
Просмотров:
2482
Feature Flags in .NET Core favorites 0

Feature flags, also known as feature toggles or feature flags, are a powerful technique used in software development to enable or disable specific features or code paths in your application without modifying the code itself. This allows you to release new features gradually, test them with a subset of users, or respond quickly to issues by toggling features on or off remotely.

Implement Feature Flag

  • add these packages but you should enable pre-release support because it’s not officially out yet even though it’s preview and it has many many download:
    add Microsoft.FeatureManagement package
    add Microsoft.FeatureManagement.AspNetCore package
  • in program.cs builder.Services.AddFeatureManagement();
  • in appsettings.json add this key FeatureManagement that has NewFeatureFlag with boolean value
"FeatureManagement": {
    "NewFeatureFlag": true
},
  • inject IFeatureManager in Controller Constructor
  • get flag value by await _featureManager.IsEnabledAsync(“NewFeatureFlag”)

Add IFeatureManager

Okay, what happens when you want to add an extra point that you want to test to a few people, we add FeatureGate(${featureFlagName})
look at the point of comment on FeatureGate

NewFeatureFlag

If we use .Net Core MVC, we can use tag helper <feature> for FeatureManagement:

@inject IFeatureManager
@addTagHelper *, Microsoft.FeatureManagement

<feature name="NewFeatureFlag" requirement="All">
  <a asp-action="GetCustomerNameForTest">Go to the GetCustomerNameForTest</a>
</feature>

We can set environment variable by Environment.SetEnvironmentVariable() in program.cs before CreateBuilder"

Environment.SetEnvironmentVariable("FeatureManagement__NewFeatureFlag", "false", EnvironmentVariableTarget.Process);

Instead of using feature flag, we can use Environment variable

Using custom Feature Flag filters

Built in filters like PercentageFilter

// we should add this line in programs.cs
builder.Services.AddFeatureManagement().AddFeatureFilter<PercentageFilter>();
// add this percentage filter in appsetting.json
// "EnabledFor" is a property that take a list of parameters to configure the features.
//    “Percentage” is built-in with feature management library.
//    The “Value” which makes the feature flag decision.
"NewPercentageFilter": {
      "EnabledFor": [
        {
          "Name": "Percentage", // this is name of built-in filter as we use PercentageFilter s
          "Parameters": { // PercentageFilter acccept
            "Value": 50
          }
        }
      ]
    }
[HttpGet("TestPercentageFilter")]
[FeatureGate("NewPercentageFilter")] // add this if you want to return only A if 'NewPercentageFilter' is true
public async Task<string> TestPercentageFilter()
{
  // check if NewPercentageFilter is true or not
  // Looks like the algorithms are switching between "A" and "B" on an average of 50 percentage
  var newAlgorithm = await _featureManager.IsEnabledAsync("NewPercentageFilter");

  return newAlgorithm ? "A" : "B";
}

Custom filter

Let say we need to execute endpoint on Microsoft Edge only,

  • make BrowserFilterSettings.cs that has ‘Allowed’ property and this property will use as Parameters of filter in appsetting.json
  • create custom filter BrowserFilter that implement IFeatureFilter and it’s FilterAlias ‘Browser’ this alias used in name of fitler key in appsetting.json
  • use IHttpContextAccessor to get information about the request and the current user.
  • add filter key in appsetting.json
public class BrowserFilterSettings
{
    // this property will use as Parameters of filter in appsetting.json
    public string[] Allowed { get; set; }
}
// create custom filter BrowserFilter that implement IFeatureFilter
// FilterAlias 'Browser' this alias used in name of fitler key in appsetting.json
// use IHttpContextAccessor to get information about the request and the current user.

[FilterAlias("Browser")]
public class BrowserFilter : IFeatureFilter
{
  private readonly IHttpContextAccessor _httpContextAccessor;

  public BrowserFilter(IHttpContextAccessor httpContextAccessor)
  {
    _httpContextAccessor = httpContextAccessor;
  }

  public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context)
  {
    if (_httpContextAccessor.HttpContext != null)
    {
      //  
      var userAgent = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString();
      var _browserSettings = context.Parameters.Get<BrowserFilterSettings>();
      return Task.FromResult(_browserSettings.Allowed.Any(x => userAgent.Contains(x)));
    }
      return Task.FromResult(false);
  }
}
// add filter key in appsetting.json
// filter has name with same name of FilterAlias in BrowserFilter.cs
// filter has Parameters that has 'Allowed' same as BrowserFilterSettings.cs
  "BrowserFlag": {
      "EnabledFor": [
        {
          "Name": "Browser",
          "Parameters": {
            "Allowed": [ "Edg" ]
          }
        }
      ]
    }
// add FeatureGate with name of filter key that has define in appsetting.json
[HttpGet("ExcuteOnEdgeOnly")]
[FeatureGate("BrowserFlag")]
public async Task<ActionResult> ExcuteOnEdgeOnly()
{
    return Ok();
}
// add AddHttpContextAccessor in programs.cs
// add BrowserFilter in programs.cs
builder.Services.AddHttpContextAccessor();
builder.Services.AddFeatureManagement().AddFeatureFilter<BrowserFilter>();

If we run application in google chrome browser, ExcuteOnEdgeOnly will return 404 but if we run application in Microsoft Edge browser, ExcuteOnEdgeOnly will execute successfully.

• • •

Reference

https://www.c-sharpcorner.com/blogs/feature-flag-in-net-60-part-2

Похожее
Jan 13, 2024
Author: Weerayut Teja
In the world of web development, building robust and efficient REST APIs is a crucial skill. Whether you are a C# beginner or have some programming experience, creating RESTful APIs using .NET Core and Entity Framework with PostgreSQL is an...
Jul 15, 2024
I recently migrated this blog from WordPress to a custom Nuxt site. I moved from WordPress to have more control over the blog and not have to rely on plugins to do everything. It’s worked out really well but there...
Jul 21, 2024
Author: Henrik Arent
Choosing between .NET Core and .NET Framework is a crucial decision for your business. Your choice between them can significantly impact the smoothness of your software projects and the success of your business. Both of these platforms have their own...
Mar 28, 2024
Author: Hilal Yazbek
gRPC is a powerful framework for working with Remote Procedure Calls. RPCs allow you to write code as though it will be run on a local computer, even though it may be executed on another computer. One of the key...
Написать сообщение
Тип
Почта
Имя
*Сообщение
RSS
Если вам понравился этот сайт и вы хотите меня поддержать, вы можете
9 главных трендов в разработке фронтенда в 2024 году
Как мы столкнулись с версионированием и осознали, что вариант «просто проставить цифры» не работает
Переход от монолита к микросервисам: история и практика
14 вопросов об индексах в SQL Server, которые вы стеснялись задать
Performance review, ачивки и погоня за повышением грейда — что может причинить боль сотруднику IT-компании?
Тестирование PRTG Network Monitor и сравнение с Zabbix
Путеводитель по репликации баз данных
Soft skills: 18 самых важных навыков, которыми должен владеть каждый работник
Система визуализации и мониторинга. Grafana + Prometheus
Погружение в 0.0.0.0 Day: как «нулевой» IP-адрес позволяет взломать локальную сеть
Boosty
Donate to support the project
GitHub account
GitHub profile