using System; using System.IO; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; using LibMatrix.Services; using MatrixUtils.Abstractions; using MatrixUtils.Desktop; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using ModerationClient.Services; using ModerationClient.ViewModels; using ModerationClient.Views; namespace ModerationClient; public partial class App : Application { /// /// Gets the current instance in use /// public new static App Current => (App)Application.Current; /// /// Gets the instance to resolve application services. /// public IServiceProvider Services => Host.Services; public IHost Host { get; private set; } public override void Initialize() { AvaloniaXamlLoader.Load(this); } // ReSharper disable once AsyncVoidMethod public override async void OnFrameworkInitializationCompleted() { var builder = Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder(Environment.GetCommandLineArgs()); builder.Services.AddTransient(); ConfigureServices(builder.Services); // builder.Services.AddHostedService(); Host = builder.Build(); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { // Line below is needed to remove Avalonia data validation. // Without this line you will get duplicate validations from both Avalonia and CT BindingPlugins.DataValidators.RemoveAt(0); // desktop.MainWindow = new MainWindow { // DataContext = Host.Services.GetRequiredService() // }; desktop.MainWindow = Host.Services.GetRequiredService(); desktop.Exit += (sender, args) => { Host.StopAsync(TimeSpan.FromSeconds(5)).GetAwaiter().GetResult(); Host.Dispose(); }; } base.OnFrameworkInitializationCompleted(); await Host.StartAsync(); } /// /// Configures the services for the application. /// private static IServiceProvider ConfigureServices(IServiceCollection services) { services.AddRoryLibMatrixServices(new() { AppName = "ModerationClient", }); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(x => { var cmdLine = x.GetRequiredService(); return new TieredStorageService( cacheStorageProvider: new FileStorageProvider(Directory.CreateTempSubdirectory($"modcli-{cmdLine.Profile}").FullName), dataStorageProvider: new FileStorageProvider(Directory.CreateTempSubdirectory($"modcli-{cmdLine.Profile}").FullName) ); } ); // Register views services.AddSingleton(); services.AddTransient(); services.AddTransient(); // Register ViewModels services.AddTransient(); return services.BuildServiceProvider(); } }