using IBKRTrader.Core.AI; using IBKRTrader.Core.Budget; using IBKRTrader.Core.Database; using IBKRTrader.Core.Database.Migrations; using IBKRTrader.Core.IBKR; using IBKRTrader.Core.Logging; using IBKRTrader.Core.Modules; using IBKRTrader.Core.Settings; using IBKRTrader.Core.Trading; using IBKRTrader.Core.Workers; using IBKRTrader.Core.Workers.BuiltIn; using IBKRTrader.Modules.CongressTrading; using IBKRTrader.UI; using Microsoft.Extensions.DependencyInjection; namespace IBKRTrader; internal static class Program { [STAThread] static void Main() { ApplicationConfiguration.Initialize(); // ── DI-Container aufbauen ──────────────────────────────────────────── var services = new ServiceCollection(); // Core: Settings (zuerst laden) var settingsService = new SettingsService(); settingsService.Load(); services.AddSingleton(settingsService); // Core: Logging services.AddSingleton(); // Core: Database services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Core: IBKR Services services.AddSingleton(); services.AddSingleton(); // Core: Other Services services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Core: Trading-Kern services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Sicherer Standard-Broker: handelt nicht, bis der echte IBKR-Adapter // angebunden und gegen den Paper-Gateway verifiziert ist. services.AddSingleton(); // Core: Built-In Worker services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // ── Module registrieren ────────────────────────────────────────────── // Der Core kennt konkrete Module nicht: Module werden hier instanziiert, // hängen ihre Services über IModule.RegisterServices ein und werden über // die ModuleRegistry zugänglich gemacht. IModule[] modules = [ new CongressTradingModule(), ]; foreach (var module in modules) module.RegisterServices(services); var moduleRegistry = new ModuleRegistry(modules); services.AddSingleton(moduleRegistry); // ── IWorker-Sammlung: Core + Module ────────────────────────────────── services.AddSingleton>(sp => new IWorker[] { // Core-Worker sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), // IBKR Market Data Worker sp.GetRequiredService(), sp.GetRequiredService(), } // Modul-Worker dynamisch anhängen .Concat(moduleRegistry.Modules.SelectMany(m => m.GetWorkers(sp))) .ToArray()); services.AddSingleton(); // UI: Launcher + Fenster-Verwaltung services.AddSingleton(); services.AddSingleton(); var provider = services.BuildServiceProvider(); // WebApiService bekommt Engine-Referenz (zirkuläre Abhängigkeit auflösen) var webApi = provider.GetRequiredService(); var engine = provider.GetRequiredService(); webApi.SetEngine(engine); Application.Run(provider.GetRequiredService()); } }