using AvParser.Core.Collecting; using AvParser.Core.Proxies; using AvParser.Core.Settings; using AvParser.Infrastructure.Proxies; using AvParser.Infrastructure.Storage; using AvParser.UI.Media; using AvParser.UI.Navigation; using AvParser.UI.Services; using AvParser.UI.ViewModels; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Serilog.Core; namespace AvParser.UI.DependencyInjection; /// Composition root for the presentation layer. public static class UiServiceCollectionExtensions { /// Registers the view locator, shell services and every page. /// /// Pages are registered twice on purpose: once under their concrete type (so tests and other /// pages can ask for one specifically) and once under in the order /// they should appear in the navigation rail. /// public static IServiceCollection AddAvParserUI(this IServiceCollection services) { ArgumentNullException.ThrowIfNull(services); services.AddSingleton(); services.AddSingleton(static sp => new ThumbnailCache( sp.GetRequiredService(), sp.GetRequiredService>() )); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(static sp => new DashboardViewModel( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp )); services.AddSingleton(static sp => new SettingsViewModel( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService() )); services.AddSingleton(static sp => new CollectViewModel( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp, sp.GetRequiredService>() )); services.AddSingleton(static sp => new GalleryViewModel( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService>() )); services.AddSingleton(static sp => new ProxiesViewModel( sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService>() )); services.AddSingleton(); // Order here is the order of the navigation rail; the first entry is the landing page. services.AddSingleton(static sp => sp.GetRequiredService()); services.AddSingleton(static sp => sp.GetRequiredService()); services.AddSingleton(static sp => sp.GetRequiredService()); services.AddSingleton(static sp => sp.GetRequiredService()); services.AddSingleton(static sp => sp.GetRequiredService()); services.AddSingleton(static sp => sp.GetRequiredService()); services.AddSingleton(static sp => new ShellViewModel( sp.GetRequiredService(), sp.GetRequiredService() )); return services; } }