diff --git a/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs b/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs
index 328a158..56c4399 100644
--- a/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs
+++ b/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs
@@ -8,12 +8,7 @@ namespace PolyTrader.Core.Modularity
///
/// Vertrag für ein PolyTrader-Modul. Module referenzieren nur den Core, niemals
/// einander. Ein Modul kapselt einen eigenständigen Funktionsbereich (z.B. Copytrading)
- /// mit eigenen Services, Jobs, DB-Objekten und – ab Phase 5 – eigenen UI-Tabs und
- /// Settings-Sektionen.
- ///
- /// Hinweis: Der UI-Beitrag (RegisterUi/IModuleUiHost) wird in Phase 5 ergänzt, sobald
- /// die konkrete UI-Integration (Tabs + Settings-Sektion) feststeht. Bis dahin deckt der
- /// Contract Lebenszyklus und Service-Registrierung ab.
+ /// mit eigenen Services, Jobs, DB-Objekten sowie eigenen UI-Ansichten und Settings-Sektionen.
///
public interface IPolyTraderModule
{
@@ -32,6 +27,13 @@ namespace PolyTrader.Core.Modularity
///
void RegisterServices(IServiceCollection services, IConfiguration configuration);
+ ///
+ /// Registriert die UI-Ansichten des Moduls bei der Shell (Launcher). Die Shell öffnet
+ /// jede Ansicht auf Wunsch in einem eigenen Host-Fenster. Module liefern designbare
+ /// UserControls; die Shell bleibt modul-agnostisch.
+ ///
+ void RegisterUi(IModuleUiHost host);
+
/// Wird nach der Core-Hydration gestartet (kein Anlaufen gegen leeren State).
Task StartAsync(CancellationToken cancellationToken);
diff --git a/src/PolyTrader.Core/Modularity/ModuleUi.cs b/src/PolyTrader.Core/Modularity/ModuleUi.cs
new file mode 100644
index 0000000..e6083fc
--- /dev/null
+++ b/src/PolyTrader.Core/Modularity/ModuleUi.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Windows.Forms;
+
+namespace PolyTrader.Core.Modularity
+{
+ ///
+ /// Eine vom Core oder einem Modul beigesteuerte UI-Ansicht. Die Shell entscheidet,
+ /// wie sie präsentiert wird (aktuell: eigenständiges Host-Fenster über den Launcher).
+ /// Die eigentliche UI ist ein designbares (i.d.R. ein UserControl),
+ /// das über erzeugt wird (mit DI-Abhängigkeiten).
+ ///
+ public sealed class ModuleView
+ {
+ /// Stabile ID für Einzelinstanz-Handling (nur ein Fenster je View).
+ public string Id { get; init; } = Guid.NewGuid().ToString();
+
+ /// Titel für Launcher-Eintrag und Fenstertitel.
+ public string Title { get; init; } = "View";
+
+ /// Optionale Gruppierung im Launcher (z.B. "Core", "CopyTrading").
+ public string? Group { get; init; }
+
+ /// Optionale Sortierreihenfolge im Launcher.
+ public int Order { get; init; } = 0;
+
+ /// Erzeugt das anzuzeigende Control (frische Instanz je Fensteröffnung).
+ public Func CreateControl { get; init; } = () => new Control();
+
+ public int PreferredWidth { get; init; } = 900;
+ public int PreferredHeight { get; init; } = 600;
+ }
+
+ ///
+ /// Wird der Shell beim Start übergeben; Core und Module registrieren hier ihre Ansichten.
+ /// Der Launcher rendert daraus seine Einträge und öffnet je View ein Host-Fenster.
+ ///
+ public interface IModuleUiHost
+ {
+ void RegisterView(ModuleView view);
+ }
+}
diff --git a/src/PolyTrader.Core/PolyTrader.Core.csproj b/src/PolyTrader.Core/PolyTrader.Core.csproj
index b22feec..404fb98 100644
--- a/src/PolyTrader.Core/PolyTrader.Core.csproj
+++ b/src/PolyTrader.Core/PolyTrader.Core.csproj
@@ -4,6 +4,9 @@
net8.0-windows
enable
enable
+
+ true