Was sind Feature-Flags und warum brauchen Sie sie?
\nStellen Sie sich vor: Sie haben eine tolle neue Funktion geschrieben – zum Beispiel eine intelligente Suche mit Autovervollständigung. Alles getestet, der Code wurde reviewed. Aber Sie sind sich nicht zu 100% sicher, ob die Benutzer sie annehmen werden. Oder Sie haben Angst, dass sie unter Last zusammenbricht. Was tun?
\nFrüher war die Antwort einfach: „Spiel es auf Produktion aus und bete.“ Heute sind wir schlauer. Wir verwenden Feature-Flags (Feature Toggles) – einen Mechanismus, der es ermöglicht, Funktionalitäten im laufenden Betrieb ein- und auszuschalten, ohne Neukompilierung und erneutes Deployment.
\nIn diesem Artikel auf PythonLib werden wir uns ansehen, wie man Feature-Flags in C#-Projekten implementiert – von der einfachsten Umsetzung bis hin zu fortgeschrittenen Szenarien mit A/B-Testing und Canary-Releases.
\n\nWarum Feature-Flags ein Must-have für C#-Entwickler sind
\nFeature Flags C# lösen drei zentrale Aufgaben:
\n- \n
- Sicheres Deployment: Spielen Sie Code in die Produktion aus, auch wenn die Funktion noch nicht fertig ist. Schalten Sie einfach das Flag aus. \n
- Sofortige Deaktivierung: Läuft etwas schief? Ein Klick im Admin-Panel – und die problematische Funktion ist verschwunden. \n
- Flexible Funktionsverwaltung: Aktivieren Sie Funktionen für bestimmte Benutzer, Regionen oder zeitgesteuert. \n
Und das Beste: Für die Funktionsverwaltung in .NET müssen Sie das Rad nicht neu erfinden – es gibt die fertige Bibliothek Microsoft.FeatureManagement.
Der einfachste Weg: Konfigurationsdatei
\nBeginnen wir mit dem grundlegenden Ansatz – über appsettings.json. Das ist ideal für einfache Feature Toggles .NET.
Schritt 1: Einstellungen hinzufügen
\n{\n "FeatureManagement": {\n "NewSearchEngine": true,\n "DarkMode": false,\n "BetaDashboard": true\n }\n}\n\nSchritt 2: Dienst registrieren
\nIn Program.cs fügen wir hinzu:
builder.Services.AddFeatureManagement();\n\nSchritt 3: Im Code verwenden
\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}\nFertig! Um die neue Funktion zu aktivieren, reicht es jetzt, true in false in der Konfiguration zu ändern und die Anwendung neu zu starten. Aber wir wollen doch ohne Neustart, oder?
Dynamische Feature-Flags: Umschalten ohne Neustart
\nFür bedingte Features C# ohne Neuladen verwenden wir Konfigurationsanbieter, die Änderungen nachladen. Die beste Option ist eine Datenbank oder Redis.
\n\nAnbieter aus der Datenbank erstellen
\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\nRegistrieren:
\nbuilder.Services.AddFeatureManagement