using Hyperbar.Windows.Interop; using Hyperbar.Windows.UI; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.UI.Dispatching; namespace Hyperbar.Windows { public static class IServiceCollectionExtensions { public static IServiceCollection AddWidgetProvider(this IServiceCollection services) where TWidgetProvider : IWidgetProvider, new() { DispatcherQueueSynchronizationContext context = new(DispatcherQueue.GetForCurrentThread()); SynchronizationContext.SetSynchronizationContext(context); TWidgetProvider builder = new(); IHost? host = new HostBuilder() .UseContentRoot(AppContext.BaseDirectory) .ConfigureAppConfiguration(config => { config.SetBasePath(AppContext.BaseDirectory); config.AddJsonFile("Settings.json", true, true); config.Build(); }) .ConfigureServices((context, isolatedServices) => { isolatedServices.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); isolatedServices.AddHostedService(); isolatedServices.AddTransient(); isolatedServices.AddScoped(); isolatedServices.AddScoped(); isolatedServices.AddScoped(); isolatedServices.AddHandler(); isolatedServices.AddHandler(); isolatedServices.AddTransient(); isolatedServices.AddContentTemplate(); isolatedServices.AddContentTemplate(); isolatedServices.AddContentTemplate(); builder.Create(context, isolatedServices); }).Build(); services.AddTransient(provider => new WidgetContext(host.Services)); host.Start(); return services; } } }