using System.Windows; using CursorLang.Models; using CursorLang.Services; using CursorLang.ViewModels; using CursorLang.Views; using Microsoft.Extensions.DependencyInjection; namespace CursorLang; /// /// Композиционный корень: собирает контейнер и запускает окно настроек. /// public partial class App : Application { private ServiceProvider? _services; private SingleInstanceGate? _instanceGate; protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var gate = new SingleInstanceGate(); if (!gate.TryAcquire()) { gate.Dispose(); Shutdown(); return; } _instanceGate = gate; _instanceGate.ActivationRequested += OnActivationRequested; var services = new ServiceCollection(); ConfigureServices(services); _services = services.BuildServiceProvider(); _services.GetRequiredService(); MainWindow = _services.GetRequiredService(); MainWindow.Show(); _services.GetRequiredService().Start(); _services.GetRequiredService().Start(); } protected override void OnExit(ExitEventArgs e) { _services?.Dispose(); if (_instanceGate is not null) { _instanceGate.ActivationRequested -= OnActivationRequested; _instanceGate.Dispose(); } base.OnExit(e); } private void OnActivationRequested(object? sender, EventArgs e) { if (MainWindow is not { IsVisible: true }) { return; } if (MainWindow.WindowState == WindowState.Minimized) { MainWindow.WindowState = WindowState.Normal; } MainWindow.Activate(); } private static void ConfigureServices(IServiceCollection services) { services.AddSingleton(new KeyboardLayoutOptions()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService().Load()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); } }