Phase 1: Modul-System formalisiert (IModule + ModuleRegistry) - Core/Modules/IModule.cs: Vertrag (Key, DisplayName, Description, Version, RegisterServices, InitializeAsync, GetWorkers, CreateWindow) - Core/Modules/ModuleRegistry.cs - CongressTradingModule auf IModule umgestellt (instanzbasiert, Platzhalter-Fenster) - Program.cs iteriert ueber IModule[] + Registry; Form1 initialisiert Module ueber Registry - Testbarkeit: WorkerBase DB-Log-Seam (virtuell); CapitolTradesScraper.ParseTradesFromHtml extrahiert (offline gegen ct_raw.html testbar) - Tests: ModuleRegistry, CongressTradingModule, WorkerBase, CapitolTradesScraper -> 15/15 gruen Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
23 lines
918 B
C#
23 lines
918 B
C#
namespace IBKRTrader.Core.Modules;
|
|
|
|
/// <summary>
|
|
/// Zentrale Registry aller geladenen Module.
|
|
/// Wird in Program.cs mit den Modul-Instanzen befüllt und als Singleton
|
|
/// bereitgestellt, damit Launcher und Startup-Code über die Module iterieren
|
|
/// können, ohne konkrete Modultypen zu kennen.
|
|
/// </summary>
|
|
public class ModuleRegistry
|
|
{
|
|
private readonly List<IModule> _modules;
|
|
|
|
public ModuleRegistry(IEnumerable<IModule> modules)
|
|
=> _modules = modules?.ToList() ?? throw new ArgumentNullException(nameof(modules));
|
|
|
|
/// <summary>Alle registrierten Module in Registrierungsreihenfolge.</summary>
|
|
public IReadOnlyList<IModule> Modules => _modules;
|
|
|
|
/// <summary>Findet ein Modul anhand seines Kürzels (case-insensitive) oder null.</summary>
|
|
public IModule? Find(string key)
|
|
=> _modules.FirstOrDefault(m => string.Equals(m.Key, key, StringComparison.OrdinalIgnoreCase));
|
|
}
|