R2: Generic Host + Modul-Vertrag + Shell-UI (PolytraderSharp-Konzept)

- Core/Modularity: neuer IModule (Name, DbPrefix, RegisterServices(services,config),
  RegisterUi(host,sp), StartAsync/StopAsync, GetActivationBlocker) + ModuleView
  + IModuleUiHost + WindowMenu. Alte IModule/ModuleRegistry/WindowManager/ModuleFormBase entfernt.
- Program.cs: Host.CreateDefaultBuilder + IConfiguration (appsettings.json/.Local.json);
  Core-Services registriert, Module via RegisterServices, Views via RegisterUi.
- UI: ShellUiHost (Einzelinstanz-Fenster + Fenster-Menue), LauncherForm als Shell
  (Buttons je View), Core-Views Logs/Settings/Workers als eigene Fenster.
- CongressTrading auf neuen Vertrag; Worker als IWorker registriert.
- --smoke-ui Headless-Test (konstruiert jede View + Launcher).
- appsettings.Local.json gitignored.
- Tests angepasst -> 30/30 gruen; Build + Smoke-UI + App-Start verifiziert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
This commit is contained in:
Richard
2026-07-28 00:24:00 +02:00
parent c20538c8d8
commit 8f44c0fd82
25 changed files with 695 additions and 1047 deletions
+21
View File
@@ -0,0 +1,21 @@
using IBKRTrader.Core.Logging;
namespace IBKRTrader.UI.Views;
/// <summary>Core-View: Live-Log (RichTextBox), an den LoggingService gebunden.</summary>
public sealed class LogsView : Form
{
public LogsView(LoggingService logger)
{
Text = "Logs";
Width = 1000;
Height = 650;
StartPosition = FormStartPosition.CenterScreen;
var rtb = new RichTextBox { Dock = DockStyle.Fill };
Controls.Add(rtb);
// Verbindet den Logger mit der RichTextBox (Theme + AttachRichTextBox).
_ = new LogPanelController(rtb, logger);
}
}
+23
View File
@@ -0,0 +1,23 @@
using IBKRTrader.Core.Settings;
namespace IBKRTrader.UI.Views;
/// <summary>Core-View: Einstellungen (PropertyGrid auf AppSettings) mit Speichern-Button.</summary>
public sealed class SettingsView : Form
{
public SettingsView(SettingsService settings)
{
Text = "Settings";
Width = 820;
Height = 720;
StartPosition = FormStartPosition.CenterScreen;
var grid = new PropertyGrid { Dock = DockStyle.Fill, SelectedObject = settings.Settings };
var save = new Button { Text = "Speichern", Dock = DockStyle.Bottom, Height = 36 };
save.Click += (_, _) => settings.Save();
Controls.Add(grid);
Controls.Add(save);
}
}
+20
View File
@@ -0,0 +1,20 @@
using IBKRTrader.Core.Workers;
namespace IBKRTrader.UI.Views;
/// <summary>Core-View: Worker/Services-Übersicht (DataGridView, live an die WorkerEngine gebunden).</summary>
public sealed class WorkersView : Form
{
public WorkersView(WorkerEngine engine)
{
Text = "Workers / Services";
Width = 1200;
Height = 700;
StartPosition = FormStartPosition.CenterScreen;
var dgv = new DataGridView { Dock = DockStyle.Fill };
Controls.Add(dgv);
WorkerListBindingSource.Setup(dgv, engine.WorkerInfos);
}
}