Files
IBKRTrader/Program.cs
T
Richard af398353f0 @
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>
@
2026-07-27 10:07:47 +02:00

98 lines
3.7 KiB
C#

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 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<LoggingService>();
// Core: Database
services.AddSingleton<DatabaseService>();
services.AddSingleton<CoreMigrations>();
services.AddSingleton<IBKRMigrations>();
// Core: IBKR Services
services.AddSingleton<IBKRGatewayService>();
services.AddSingleton<IBKRMarketDataRepository>();
// Core: Other Services
services.AddSingleton<BudgetService>();
services.AddSingleton<TradeHistoryService>();
services.AddSingleton<AIModelService>();
// Core: Built-In Worker
services.AddSingleton<BackupWorker>();
services.AddSingleton<WebserverService>();
services.AddSingleton<WebApiService>();
services.AddSingleton<IBKRInstrumentSyncWorker>();
services.AddSingleton<IBKRPriceHistoryWorker>();
// ── 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<IEnumerable<IWorker>>(sp => new IWorker[]
{
// Core-Worker
sp.GetRequiredService<BackupWorker>(),
sp.GetRequiredService<WebserverService>(),
sp.GetRequiredService<WebApiService>(),
// IBKR Market Data Worker
sp.GetRequiredService<IBKRInstrumentSyncWorker>(),
sp.GetRequiredService<IBKRPriceHistoryWorker>(),
}
// Modul-Worker dynamisch anhängen
.Concat(moduleRegistry.Modules.SelectMany(m => m.GetWorkers(sp)))
.ToArray());
services.AddSingleton<WorkerEngine>();
services.AddSingleton<Form1>();
var provider = services.BuildServiceProvider();
// WebApiService bekommt Engine-Referenz (zirkuläre Abhängigkeit auflösen)
var webApi = provider.GetRequiredService<WebApiService>();
var engine = provider.GetRequiredService<WorkerEngine>();
webApi.SetEngine(engine);
Application.Run(provider.GetRequiredService<Form1>());
}
}