using System.IO; using FellowOakDicom; using FellowOakDicom.Imaging; using Livia.Models; using Livia.Models.Data; using Livia.Properties; using Livia.ViewModels; using Livia.Views.Utility; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Serilog; using Serilog.Events; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace Livia.Utility.DependencyInjection; public static class ServiceProviderFactory { public static string LogFolder { get; set; } public static IServiceProvider ServiceProvider { get { if (_serviceProvider == null) throw new NullReferenceException(); return _serviceProvider; } } private static IServiceProvider? _serviceProvider; static ServiceProviderFactory() { LogFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"AnImage\Livia\Log"); } public static void Init(Action injectionActions) { _serviceProvider = ConfigureDependencyInjection(injectionActions); } private static IServiceProvider ConfigureDependencyInjection(Action addLiviaControlViewModel) { ServiceCollection serviceCollection = []; new DicomSetupBuilder() .RegisterServices(s => s.AddFellowOakDicom().AddImageManager()) .Build(); Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Trace() .WriteTo.File(Path.Combine(LogFolder, "Log.txt"), rollingInterval: RollingInterval.Day) .WriteTo.File(Path.Combine(LogFolder, "ErrorLog.txt"), LogEventLevel.Error, rollingInterval: RollingInterval.Day) .CreateLogger(); serviceCollection.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true)); serviceCollection.AddSingleton(svc => svc.GetRequiredService>()); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddHttpClient(x => { x.Timeout = TimeSpan.FromMinutes(10); UriBuilder uriBuilder = new() { Scheme = Settings.Default.ServerPort == 443 ? "https" : "http", Host = Settings.Default.ServerAddress, Port = Settings.Default.ServerPort }; x.BaseAddress = uriBuilder.Uri; }); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); addLiviaControlViewModel(serviceCollection); ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); return serviceProvider; } }