Que sont les feature flags et pourquoi en avez-vous besoin
\nImaginez : 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 ?
\nAvant, 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.
\nDans 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\nPourquoi les feature flags sont indispensables pour le développeur C#
\nLes 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
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.
La méthode la plus simple : le fichier de configuration
\nCommençons par l'approche de base — via appsettings.json. C'est idéal pour les feature toggles .NET simples.
É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
\nDans Program.cs, ajoutez :
builder.Services.AddFeatureManagement();\n\nÉtape 3. Utilisation dans le code
\npublic 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}\nTerminé ! 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 ?
Feature flags dynamiques : basculement sans redémarrage
\nPour 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\nCréation d'un fournisseur à partir d'une base de données
\npublic 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\nEnregistrement :
\nbuilder.Services.AddFeatureManagement