using System; using System.IO; using System.Runtime.InteropServices; using FileTime.Avalonia.Application; using FileTime.Avalonia.Configuration; using FileTime.Avalonia.IconProviders; using FileTime.Avalonia.Logging; using FileTime.Avalonia.Services; using FileTime.Avalonia.ViewModels; using FileTime.Avalonia.ViewModels.ItemPreview; using FileTime.Core.Interactions; using FileTime.Core.Persistence; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Serilog; using Serilog.Configuration; namespace FileTime.Avalonia { internal static class Startup { internal static IServiceCollection AddViewModels(this IServiceCollection serviceCollection) { return serviceCollection .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddSingleton(); } internal static IServiceCollection AddServices(this IServiceCollection serviceCollection) { serviceCollection = serviceCollection .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton(new PersistenceSettings(Program.AppDataRoot)) .AddSingleton() .AddSingleton() .AddSingleton(); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { serviceCollection.AddSingleton(); } else { serviceCollection.AddSingleton(); } return serviceCollection; } 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, reloadOnChange: true) .AddJsonFile($"appsettings.{Program.EnvironmentName}.json", true, 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; } public static LoggerConfiguration MessageBoxSink( this LoggerSinkConfiguration loggerConfiguration, IServiceProvider serviceProvider) { return loggerConfiguration.Sink(serviceProvider.GetService()); } } }