Feature flags in ASP.NET Core
I've been working on a few ASP.NET Core applications recently which has given me cause and opportunity to gate some functionality access behind feature flags whilst it's a work in progress, rather than having it gated behind
if (app.Environment.IsDevelopment()) or similar where I then have to make code changes to enable the functionality. I've been doing this by using the Microsoft.FeatureManagement.AspNetCore NuGet package which serves me with absolutely everything I need, at least for my relatively simple use cases. The readme on GitHub gives a pretty complete summary of how to use the package but for the sake of completness, here's a basic example excerpted from the implementation I'm using right now.
Adding support to an ASP.NET Core 6 project is as simple as adding the library and then calling the AddFeatureManagement extension method:
using Microsoft.FeatureManagement; var builder = WebApplication.CreateBuilder(args); builder.Services.AddFeatureManagement();
With that complete it's almost trivial to gate functionality in markup in a razor view behind a flag:
<feature name="SearchInTopHat"> <form class="d-flex float-md-end" asp-controller="home" asp-action="search"> <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search" id="q" name="q"> <button class="btn btn-outline-light" type="submit">Search>/button> </form> </feature>
I've used strings for feature name (the examples in the documentation use an
enum which does make for stronger typing in your code but doesn't fully eliminate the risk of typos as it doesn't flow through to the configuration file. In the configuration file the absence of a feature flag implies that it's false which I use to leave all new/un-finished features switched off in production but then enable them in development by listing them in configuration explicitly:
Documentation for the tag helper can be found at docs.microsoft.com (code: on GitHub). Finding the documentation is mildly tricky as the it's structured by namespace whereas you'll never actually reference the namespace, for the most part - the @addTagHelper directive that needs to be added to _ViewImports.cshtml is usually of the just name the assembly and pull in everything variety. However, once you've found the documentation you can see the different ways the tag helper can be wrangled. Of particular use is the 'Negate' property which allows you to show something when a feature is disabled.
I've only made use of it in a .NET Core web application but it's equally usable in other .NET Core scenarios and has a lot more to it than the surface-level functionality I've described - but that's probably what 80% of people, like me, looking for this will need. It's definitely better than baking your own feature flag functionality and far, far, quicker!