using Daybreak.Models; using Daybreak.Services.Options; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using System.Extensions; namespace Daybreak.Extensions; public static class ServiceCollectionExtensions { public static IServiceCollection AddDaybreakOptions(this IServiceCollection services) where TOptions : class, new() { services.AddSingleton(new OptionEntry(typeof(TOptions))); services.AddSingleton>(sp => new DaybreakOptionsFactory(sp.GetRequiredService())); services.AddSingleton>(sp => new DaybreakOptionsChangeTokenSource(sp.GetRequiredService())); services.AddSingleton, OptionsCache>(); services.AddSingleton>(sp => { var factory = sp.GetRequiredService>(); var sources = sp.GetServices>(); var cache = sp.GetRequiredService>(); var monitor = new OptionsMonitor(factory, sources, cache); monitor.OnChange((_, name) => cache.TryRemove(name ?? Options.DefaultName)); return new OptionsMonitor(factory, sources, cache); }); services.AddSingleton>(sp => new OptionsWrapper(sp.GetRequiredService>().CurrentValue)); services.AddScoped>(sp => new OptionsManager( sp.GetRequiredService>())); return services; } public static IServiceCollection AddHostedSingleton(this IServiceCollection services) where TImplementation : class, TInterface, IHostedService where TInterface : class { services.AddSingleton(); services.AddHostedService(sp => sp.GetRequiredService().Cast()); return services; } public static IServiceCollection AddHostedSingleton(this IServiceCollection services) where TImplementation : class, IHostedService { services.AddSingleton(); services.AddHostedService(sp => sp.GetRequiredService()); return services; } }