using System; using System.Threading; using System.Threading.Tasks; using System.Threading.Channels; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using PolyTrader.Core.Modularity; using PolyTrader.Modules.CopyTrading.Persistence; using PolyTrader.Modules.CopyTrading.Persistence.Ef; using PolyTrader.Modules.CopyTrading.Ui; using PolyTraderSharp; using PolyTraderSharp.Models; using PolyTraderSharp.Services; namespace PolyTrader.Modules.CopyTrading { /// /// Das Copytrading-Modul: registriert seinen eigenen State, seine Channels, sein /// Trade-Log-Repository und seine Services selbst. Die App kennt nur den Contract. /// public class CopyTradingModule : IPolyTraderModule { public string Name => "CopyTrading"; public string DbPrefix => "ct_"; public void RegisterServices(IServiceCollection services, IConfiguration configuration) { // Copytrading-Hot-Path-State services.AddSingleton(); // Signal-/Trade-Channels des Moduls var copySignalChannel = Channel.CreateUnbounded(); var closedTradeChannel = Channel.CreateUnbounded(); services.AddSingleton(copySignalChannel.Writer); services.AddSingleton(copySignalChannel.Reader); services.AddSingleton(closedTradeChannel.Writer); services.AddSingleton(closedTradeChannel.Reader); // Modul-Persistenz: EF Core / Pomelo / MySQL (thread-safer DbContextFactory). var conn = configuration["Database:MySqlConnectionString"] ?? string.Empty; services.AddDbContextFactory(o => o.UseMySql(conn, ServerVersion.AutoDetect(conn))); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Modul-Services (Signalquelle, Ausführung, Analytics) services.AddSingleton(); services.AddHostedService(sp => sp.GetRequiredService()); services.AddHostedService(); services.AddHostedService(); } public void RegisterUi(IModuleUiHost host, IServiceProvider services) { host.RegisterView(new ModuleView { Id = "copytrading.masters", Title = "Master-Trader", Group = "CopyTrading", Order = 100, CreateForm = () => new MasterTradersView( services.GetRequiredService(), services.GetRequiredService(), services.GetRequiredService()) }); host.RegisterView(new ModuleView { Id = "copytrading.closedtrades", Title = "Geschlossene Copytrades", Group = "CopyTrading", Order = 110, CreateForm = () => new ClosedTradesView( services.GetRequiredService(), services.GetRequiredService(), services.GetRequiredService()) }); host.RegisterView(new ModuleView { Id = "copytrading.accountsettings", Title = "Copytrading-Account-Einstellungen", Group = "CopyTrading", Order = 120, CreateForm = () => new AccountSettingsView( services.GetRequiredService(), services.GetRequiredService(), services.GetRequiredService()) }); } public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; } }