Feature flags en C# : comment activer des fonctionnalités sans redéploiement

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Que sont les feature flags et pourquoi en avez-vous besoin

\n

Imaginez : vous avez développé une super nouvelle fonctionnalité — par exemple, une recherche intelligente avec autocomplétion. Tout est testé, le code a été relu. Mais vous n'êtes pas sûr à 100% que les utilisateurs l'adopteront. Ou vous craignez qu'elle ne tienne pas sous la charge. Que faire ?

\n

Avant, la réponse était simple : « Déployez en production et priez ». Aujourd'hui, nous sommes plus intelligents. Nous utilisons les feature flags (indicateurs de fonctionnalités, toggles de fonctionnalités) — un mécanisme qui permet d'activer et de désactiver des fonctionnalités à la volée, sans recompilation ni redéploiement.

\n

Dans cet article sur PythonLib, nous allons voir comment intégrer les feature flags dans des projets C# — de l'implémentation la plus simple aux scénarios avancés avec tests A/B et déploiements canary.

\n\n

Pourquoi les feature flags sont indispensables pour le développeur C#

\n

Les feature flags C# résolvent trois problèmes clés :

\n
    \n
  • Déploiement sécurisé : déployez le code en production, même si la fonctionnalité n'est pas encore prête. Il suffit de désactiver le flag.
  • \n
  • Désactivation instantanée : quelque chose ne va pas ? Un clic dans l'admin et la fonctionnalité problématique disparaît.
  • \n
  • Gestion flexible des fonctionnalités : activez des fonctionnalités pour des utilisateurs spécifiques, des régions ou selon le temps.
  • \n
\n

Et le meilleur : pour la gestion des fonctionnalités dans .NET, pas besoin de réinventer la roue — la bibliothèque prête à l'emploi Microsoft.FeatureManagement existe.

\n\n

La méthode la plus simple : le fichier de configuration

\n

Commençons par l'approche de base — via appsettings.json. C'est idéal pour les feature toggles .NET simples.

\n\n

Étape 1. Ajout des paramètres

\n
{\n  "FeatureManagement": {\n    "NewSearchEngine": true,\n    "DarkMode": false,\n    "BetaDashboard": true\n  }\n}
\n\n

Étape 2. Enregistrement du service

\n

Dans Program.cs, ajoutez :

\n
builder.Services.AddFeatureManagement();
\n\n

Étape 3. Utilisation dans le code

\n
public class SearchController\n{\n    private readonly IFeatureManager _featureManager;\n\n    public SearchController(IFeatureManager featureManager)\n    {\n        _featureManager = featureManager;\n    }\n\n    public async Task<IActionResult> Search(string query)\n    {\n        if (await _featureManager.IsEnabledAsync("NewSearchEngine"))\n        {\n            return View("NewSearch", await _newEngine.SearchAsync(query));\n        }\n        return View("LegacySearch", await _oldEngine.SearchAsync(query));\n    }\n}
\n

Terminé ! Maintenant, pour activer la nouvelle fonctionnalité, il suffit de changer true en false dans le fichier de configuration et de redémarrer l'application. Mais nous voulons le faire sans redémarrage, n'est-ce pas ?

\n\n

Feature flags dynamiques : basculement sans redémarrage

\n

Pour les fonctionnalités conditionnelles C# sans redémarrage, utilisez des fournisseurs de configuration qui chargent les modifications. La meilleure option est une base de données ou Redis.

\n\n

Création d'un fournisseur à partir d'une base de données

\n
public class DatabaseFeatureDefinitionProvider : IFeatureDefinitionProvider\n{\n    private readonly AppDbContext _db;\n\n    public DatabaseFeatureDefinitionProvider(AppDbContext db)\n    {\n        _db = db;\n    }\n\n    public async Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)\n    {\n        var feature = await _db.FeatureFlags\n            .FirstOrDefaultAsync(f => f.Name == featureName);\n        \n        return feature != null \n            ? new FeatureDefinition { Name = feature.Name, EnabledFor = feature.EnabledFor }\n            : null;\n    }\n\n    public IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()\n    {\n        return _db.FeatureFlags\n            .Select(f => new FeatureDefinition { Name = f.Name, EnabledFor = f.EnabledFor })\n            .AsAsyncEnumerable();\n    }\n}
\n\n

Enregistrement :

\n
builder.Services.AddFeatureManagement                

Blogs

Book Recommendations