Phase 2: Launcher-UI + eigenstaendige Modul-Fenster - Form1 -> LauncherForm (Dateien via git mv, Designer/resx angepasst) - Modul-Tab: Karten aus ModuleRegistry mit "Fenster oeffnen"-Button je Modul - UI/WindowManager: Fenster-Tracking (Key->Form), Re-Open fokussiert, CloseAll - UI/ModuleFormBase: Basisklasse fuer eigenstaendige Modul-Fenster - CongressTradingForm: DB-Kennzahlen + manueller Scrape-Trigger (Phase-4-Ausbau folgt) - WindowManager in DI; Launcher schliesst Modul-Fenster beim Beenden - Tests: WindowManager (6) -> 21/21 gruen; Launcher-Start verifiziert Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
69 lines
2.6 KiB
C#
69 lines
2.6 KiB
C#
using IBKRTrader.Core.Logging;
|
||
using IBKRTrader.Core.Modules;
|
||
using IBKRTrader.Core.Workers;
|
||
using IBKRTrader.Modules.CongressTrading.Database;
|
||
using IBKRTrader.Modules.CongressTrading.Scraper;
|
||
using IBKRTrader.Modules.CongressTrading.UI;
|
||
using IBKRTrader.Modules.CongressTrading.Workers;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
|
||
namespace IBKRTrader.Modules.CongressTrading;
|
||
|
||
/// <summary>
|
||
/// CongressTrading-Modul: kopiert Aktien-Trades von US-Kongressmitgliedern
|
||
/// (Quelle: capitoltrades.com).
|
||
///
|
||
/// Architektur-Regel: Dieses Modul hängt sich ausschließlich über den
|
||
/// <see cref="IModule"/>-Vertrag ein. Der Core kennt dieses Modul NICHT –
|
||
/// die Abhängigkeit geht nur von Modul → Core.
|
||
/// </summary>
|
||
public sealed class CongressTradingModule : IModule
|
||
{
|
||
public const string ModuleKey = "CT";
|
||
|
||
public string Key => ModuleKey;
|
||
public string DisplayName => "Congress Trading";
|
||
public string Description => "Kopiert Aktien-Trades von US-Kongressmitgliedern (capitoltrades.com).";
|
||
public string Version => "1.0.0";
|
||
|
||
/// <summary>Registriert alle Modul-Services im DI-Container.</summary>
|
||
public void RegisterServices(IServiceCollection services)
|
||
{
|
||
// Datenbank
|
||
services.AddSingleton<CongressMigrations>();
|
||
services.AddSingleton<CongressRepository>();
|
||
|
||
// Scraper
|
||
services.AddSingleton<CapitolTradesScraper>();
|
||
|
||
// Worker
|
||
services.AddSingleton<CongressHistoryImportWorker>();
|
||
services.AddSingleton<CongressScrapeWorker>();
|
||
}
|
||
|
||
/// <summary>Führt die Modul-Migrationen aus.</summary>
|
||
public async Task InitializeAsync(IServiceProvider provider)
|
||
{
|
||
var migrations = provider.GetRequiredService<CongressMigrations>();
|
||
await migrations.RunAsync();
|
||
|
||
// Einmaliger Reset (deaktiviert): löscht alten Fortschritt für sauberen Neustart.
|
||
// var repo = provider.GetRequiredService<CongressRepository>();
|
||
// await repo.ResetHistoryImportAsync();
|
||
}
|
||
|
||
/// <summary>Gibt die Modul-Worker für die WorkerEngine zurück.</summary>
|
||
public IEnumerable<IWorker> GetWorkers(IServiceProvider provider) =>
|
||
[
|
||
provider.GetRequiredService<CongressHistoryImportWorker>(),
|
||
provider.GetRequiredService<CongressScrapeWorker>()
|
||
];
|
||
|
||
/// <summary>Erzeugt das eigenständige Modul-Fenster.</summary>
|
||
public Form CreateWindow(IServiceProvider provider)
|
||
=> new CongressTradingForm(
|
||
provider.GetRequiredService<CongressRepository>(),
|
||
provider.GetRequiredService<WorkerEngine>(),
|
||
provider.GetRequiredService<LoggingService>());
|
||
}
|