Zum Hauptinhalt springen

Feature-Umschalter

White-Label-Bereitstellung verschifft selten jede Fähigkeit. Feature-Umschalter ermöglichen es dem Betreiber, Hauptprodukt-Features ein-/auszuschalten — zur Bereitstellungszeit über Konfiguration oder später zur Laufzeit, ohne Neubereitstellung. Alle Features sind standardmäßig aktiviert; Bereitstellung listet nur auf, welche sie ändert.

Modell​

  • Core.Features.FeatureFlag — Enum von verschließbaren Features: Authoring, Backtesting, Execution, CopyTrading, Ai, PortfolioAgent, Alerts, PropGuard, PropFirm, Accounts, OpenApi, Mcp, Compliance. Core Admin-Oberflächen (Dashboard, Benutzer, Knoten, Authentifizierung) können nie verschlossen werden, nicht hier.
  • Core.Options.FeaturesOptions — Konfiguration Basis, gebunden aus App:Features. Jede Eigenschaft wird standardmäßig true.
  • Core.Features.IFeatureGate — löst effektiven Status auf: Konfiguration Basis überlagert mit optionaler vom Besitzer gesetzter Laufzeit-Überschreibung. Implementiert von Infrastructure.Features.FeatureGate, cached Überschreibungen kurzzeitig (FeatureSettings.OverrideCacheTtl), invalidiert bei Änderung.

Laufzeit-Überschreibungen gespeichert als AppSetting Reihen Schlüssel feature.<FeatureFlag> (Wert true/false). Keine Reihe = "Konfiguration Basis verwenden".

Zwei Wege um ein Feature zu deaktivieren​

1. Bereitstellungskonfiguration (Basis)​

Flag false unter App:Features setzen. Beispiel appsettings.json:

{
"App": {
"Features": {
"CopyTrading": false,
"PropGuard": false
}
}
}

Oder via Umgebungsvariablen (Doppelunterstrich):

App__Features__CopyTrading=false

Basis verschließt Startup-Registrierung von Background-Workern (Nodes.AddNodes) und MCP-Tools (Mcp Server), daher Feature deaktiviert in Konfiguration niemals starten seine gehosteten Services noch verfügbar machen seine MCP-Tools.

2. Laufzeit-Überschreibung (Besitzer)​

Besitzer kann jedes Feature live von Einstellungen → Features (/settings/features) oder API umschalten:

GET /api/features -> [{ "flag": "CopyTrading", "enabled": true }, ...] (Owner)
PUT /api/features/{flag} body { "enabled": false } -> Überschreibung setzen (Owner)
PUT /api/features/{flag} body { "enabled": null } -> Überschreibung löschen (zurücksetzen) (Owner)

Laufzeit-Änderungen gelten sofort für Anfrage-Zeit-Verschließungen (Navigation, API). Background-Worker und MCP-Tools werden beim Startup verschlossen, nehmen Laufzeit-Änderung beim nächsten Prozess-Neustart auf.

Was jedes Gate erzwingt​

EbeneMechanismusZeitpunkt
HTTP APIRouteGroupBuilder.RequireFeature(flag) Endpoint-Filter → 404 wenn deaktiviertLaufzeit
NavigationNavMenu verbergt Links via IFeatureGate.IsEnabledLaufzeit
Background-Workerbedingt AddHostedService in Nodes.AddNodesStartup (Konfiguration)
MCP-Toolsbedingt WithTools<> im MCP-ServerStartup (Konfiguration)

Feature erreichbar über Deep-Link während deaktiviert rendert leere Seite — seine API gibt 404 zurück; nav macht es nicht mehr an die Oberfläche.

Flag → Oberflächen-Karte​

FlagAPI-GruppenNavWorker / MCP
Authoring/api/cbots, /api/paramsets, /api/buildercBots Gruppe → cBots (Param-Sets pro-cBot Dialog)MCP CBotTools
Backtesting(teilt sich /api/instances)cBots Gruppe → Backtest—
Execution/api/instancescBots Gruppe → RunMCP InstanceTools
CopyTrading/api/copyCopy TradingCopyEngineSupervisor, OpenApiTokenRefreshService, MCP CopyTools
Ai/api/aiKI Gruppe → KI; Einstellungen → KI (Schlüssel)AiRiskGuard, MCP AiTools
PortfolioAgent/api/agentKI Gruppe → Portfolio AgentPortfolioAgentService
Alerts/api/alertsKI Gruppe → BenachrichtigungenAlertEvaluator
PropGuard/api/propProp Gruppe → Prop GuardPropGuardService
PropFirm/api/prop-firmProp Gruppe → Herausforderungen—
Accounts/api/ctidsHandelskonten—
OpenApi/api/openapiEinstellungen → Open API—
Mcp/api/mcp-keysKI Gruppe → MCP-Tasten—
Compliance/api/complianceEinstellungen → Legal & Datenschutz—

Tests​

  • Unit — UnitTests/Features/FeaturesOptionsTests.cs: Basis-Standard, Pro-Flag-Abbildung.
  • Integration — IntegrationTests/FeatureGateTests.cs: Konfiguration Basis, Laufzeit-Überschreibung besiegt Konfiguration und persistiert als AppSetting, Löschen kehrt zu Basis zurück (real Postgres).
  • E2E — E2ETests/FeatureToggleTests.cs: Deaktivieren CopyTrading zur Laufzeit verbergt seinen Nav-Link und 404s /api/copy, Wiederaktivieren stellt beide wieder her.