using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Reflection; namespace Hyperbar.Widget; public class WidgetBuilder(TConfiguration configuration) : IWidgetBuilder where TConfiguration : WidgetConfiguration, new() { private readonly IHostBuilder hostBuilder = new HostBuilder() .UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), Assembly.GetEntryAssembly()?.GetName().Name!), true) .ConfigureAppConfiguration(config => { config.AddJsonFile("Settings.json", true, true); }) .ConfigureServices((context, services) => { services.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); services.AddHostedService(); services.AddScoped(); services.AddScoped(); services.AddSingleton, Value>(); services.AddHandler(); services.AddConfiguration(section: configuration.GetType().Name, configuration: configuration); services.AddConfiguration(configuration); }); public static IWidgetBuilder Configure(Action configurationDelegate) { TConfiguration configuration = new(); configurationDelegate(configuration); return new WidgetBuilder(configuration); } public IWidgetHost Build() { IHost host = hostBuilder.Build(); return (IWidgetHost)ActivatorUtilities.CreateInstance(host.Services, typeof(WidgetHost), host); } public IWidgetBuilder ConfigureServices(Action configureDelegate) { hostBuilder.ConfigureServices(configureDelegate.Invoke); return this; } }