using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace PolyTrader.Core.Modularity { /// /// Vertrag für ein PolyTrader-Modul. Module referenzieren nur den Core, niemals /// einander. Ein Modul kapselt einen eigenständigen Funktionsbereich (z.B. Copytrading) /// mit eigenen Services, Jobs, DB-Objekten sowie eigenen UI-Ansichten und Settings-Sektionen. /// public interface IPolyTraderModule { /// Eindeutiger Anzeigename des Moduls, z.B. "CopyTrading". string Name { get; } /// /// Namespace-Präfix für die DB-Objekte des Moduls (z.B. "ct_"), damit sich Module /// nicht in die Quere kommen. /// string DbPrefix { get; } /// /// Registriert die Services/Jobs des Moduls im DI-Container. Wird beim App-Start /// aufgerufen, bevor der Host gebaut wird. /// void RegisterServices(IServiceCollection services, IConfiguration configuration); /// /// Registriert die UI-Ansichten des Moduls bei der Shell (Launcher). Die Shell öffnet /// jede Ansicht auf Wunsch in einem eigenen Host-Fenster. Module liefern eigene Forms; /// die Shell bleibt modul-agnostisch. Über lösen Module ihre /// Abhängigkeiten (Repos, State) für die View-Erzeugung auf. /// void RegisterUi(IModuleUiHost host, IServiceProvider services); /// /// Optionale Vorab-Prüfung, ob das Modul aktiviert werden kann. Gibt null zurück, wenn /// aktivierbar, sonst einen kurzen, im Dashboard anzeigbaren Grund (z.B. „Alchemy-API-Key fehlt"). /// Default: immer aktivierbar. Module überschreiben dies bei harten Voraussetzungen. /// string? GetActivationBlocker(IConfiguration configuration) => null; /// Wird nach der Core-Hydration gestartet (kein Anlaufen gegen leeren State). Task StartAsync(CancellationToken cancellationToken); Task StopAsync(CancellationToken cancellationToken); } }