Feature-Flags in C#: Wie Sie Funktionen ohne erneutes Deployment aktivieren

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was sind Feature-Flags und warum brauchen Sie sie?

\n

Stellen 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?

\n

Frü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.

\n

In 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\n

Warum Feature-Flags ein Must-have für C#-Entwickler sind

\n

Feature 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
\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.

\n\n

Der einfachste Weg: Konfigurationsdatei

\n

Beginnen wir mit dem grundlegenden Ansatz – über appsettings.json. Das ist ideal für einfache Feature Toggles .NET.

\n\n

Schritt 1: Einstellungen hinzufügen

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

Schritt 2: Dienst registrieren

\n

In Program.cs fügen wir hinzu:

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

Schritt 3: Im Code verwenden

\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

Fertig! 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?

\n\n

Dynamische Feature-Flags: Umschalten ohne Neustart

\n

Für bedingte Features C# ohne Neuladen verwenden wir Konfigurationsanbieter, die Änderungen nachladen. Die beste Option ist eine Datenbank oder Redis.

\n\n

Anbieter aus der Datenbank erstellen

\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

Registrieren:

\n
builder.Services.AddFeatureManagement                

Blogs

Buchempfehlungen