using IBKRTrader.Core.Analytics; using IBKRTrader.Core.Logging; using IBKRTrader.Core.Modularity; using IBKRTrader.Core.Trading; using IBKRTrader.Core.Workers; using IBKRTrader.Modules.Accounting.Persistence; using IBKRTrader.Modules.Accounting.Services; using IBKRTrader.Modules.CongressTrading.Database; using IBKRTrader.Modules.Supervisor.Agent; using IBKRTrader.Modules.Supervisor.Persistence; using IBKRTrader.Modules.Supervisor.Services; using IBKRTrader.UI.Views.Modules; using Microsoft.Extensions.DependencyInjection; namespace IBKRTrader.UI; /// /// Registriert die Fenster der Module bei der Shell. /// /// Warum hier und nicht im Modul? Ein Modul, das sein eigenes Fenster erzeugt, muss das /// UI-Toolkit referenzieren – und wäre damit an WinForms bzw. Avalonia gebunden. Genau das verhindert /// den kopflosen Linux-Betrieb. Die Modulprojekte bleiben deshalb frei von UI-Code; ihr /// RegisterUi ist leer, und die Shell verdrahtet die Fenster zentral. Die Modul-Dienste /// kommen unverändert aus dem DI-Container. /// /// Registriert wird nur, was auch geladen ist: fehlt ein Modul in dieser Sitzung, entfällt /// sein Fenster, und der Launcher zeigt es gar nicht erst an. /// public static class ModuleViews { public static void Register(IModuleUiHost host, IServiceProvider sp) { RegisterIfLoaded(sp, "CongressTrading", () => host.RegisterView(new ModuleView { Id = "congresstrading.main", Title = "Congress Trading", Group = "CongressTrading", Order = 100, CreateView = () => new CongressTradingForm( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService()) })); RegisterIfLoaded(sp, "Supervisor", () => host.RegisterView(new ModuleView { Id = "supervisor.main", Title = "Supervisor", Group = "Supervisor", Order = 300, CreateView = () => new SupervisorMainForm( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService()) })); RegisterIfLoaded(sp, "Accounting", () => host.RegisterView(new ModuleView { Id = "accounting.main", Title = "Accounting", Group = "Accounting", Order = 400, CreateView = () => new AccountingMainForm( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService()) })); } /// Registriert die Ansicht nur, wenn das Modul in dieser Sitzung geladen ist. private static void RegisterIfLoaded(IServiceProvider sp, string moduleName, Action register) { if (sp.GetServices().Any(m => string.Equals(m.Name, moduleName, StringComparison.OrdinalIgnoreCase))) register(); } }