using System; using System.IO; using System.Runtime.InteropServices; using FileTime.App.Core.Services; using FileTime.App.Core.ViewModels; using FileTime.Core.Interactions; using FileTime.GuiApp.Configuration; using FileTime.GuiApp.CustomImpl.ViewModels; using FileTime.GuiApp.IconProviders; using FileTime.GuiApp.Logging; using FileTime.GuiApp.Services; using FileTime.GuiApp.ViewModels; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Serilog; using Serilog.Configuration; namespace FileTime.GuiApp.App; public static class Startup { internal static IServiceCollection AddViewModels(this IServiceCollection serviceCollection) { serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); return serviceCollection; } internal static IServiceCollection RegisterServices(this IServiceCollection serviceCollection) { serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { serviceCollection .AddSingleton() .AddSingleton(); } else { serviceCollection .AddSingleton() .AddSingleton(); } return serviceCollection .AddSingleton() .AddSingleton(sp => sp.GetRequiredService()); } internal static IServiceCollection RegisterLogging(this IServiceCollection serviceCollection) { return serviceCollection.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true) ); } internal static IServiceCollection AddConfiguration(this IServiceCollection serviceCollection) { var configuration = new ConfigurationBuilder() .AddInMemoryCollection(MainConfiguration.Configuration) .AddJsonFile("appsettings.json", optional: true) .AddJsonFile($"appsettings.{Program.EnvironmentName}.json", true) .Build(); return serviceCollection .Configure(configuration.GetSection(SectionNames.ProgramsSectionName)) .Configure(configuration.GetSection(SectionNames.KeybindingSectionName)) .AddSingleton(configuration); } internal static IServiceProvider InitSerilog(this IServiceProvider serviceProvider) { Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(serviceProvider.GetService()) .Enrich.FromLogContext() .WriteTo.File( Path.Combine(Program.AppDataRoot, "logs", "appLog.log"), fileSizeLimitBytes: 10 * 1024 * 1024, rollOnFileSizeLimit: true, rollingInterval: RollingInterval.Day) .WriteTo.MessageBoxSink(serviceProvider) .CreateLogger(); return serviceProvider; } private static LoggerConfiguration MessageBoxSink( this LoggerSinkConfiguration loggerConfiguration, IServiceProvider serviceProvider) { return loggerConfiguration.Sink(serviceProvider.GetService()); } }