using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Sms.Environment; using Sms.Environment.Linux; using Sms.Environment.Windows; using Sms.TaskTwo.Avalonia.Views; using Sms.TaskTwo.Core.DependencyInjection; using Sms.TaskTwo.Core.Logging; using Sms.TaskTwo.ViewModels; namespace Sms.TaskTwo.Avalonia; public partial class App : Application { public static IServiceProvider Services { get; private set; } = null!; public override void Initialize() { AvaloniaXamlLoader.Load(this); } public override void OnFrameworkInitializationCompleted() { Services = ConfigureServices(); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { var mainViewModel = Services.GetRequiredService(); desktop.MainWindow = new MainWindow(mainViewModel); desktop.ShutdownRequested += OnShutdownRequested; } base.OnFrameworkInitializationCompleted(); } private static void OnShutdownRequested(object? sender, ShutdownRequestedEventArgs e) { if (Services.GetService() is IDisposable log) { log.Dispose(); } } private static IServiceProvider ConfigureServices() { var configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var services = new ServiceCollection(); services.AddSingleton(configuration); services.AddSingleton(CreateEnvironmentStore); services.AddTaskTwoCore(configuration); services.AddSingleton(); return services.BuildServiceProvider(); } private static IEnvironmentVariableStore CreateEnvironmentStore(IServiceProvider _) => OperatingSystem.IsWindows() ? new WindowsEnvironmentVariableStore() : new LinuxEnvironmentVariableStore(); }