using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation; namespace Bitvault; public class VaultComponentsInitializer(IServiceProvider provider, IProxyServiceCollection proxy, IEnumerable> configurations, IComponentScopeCollection scopes, IVaultHostCollection vaults) : IInitializer { public async Task Initialize() { foreach (IConfigurationDescriptor configuration in configurations) { if (provider.GetRequiredService() is IVaultComponent component) { IComponentBuilder builder = component.Create(); builder.AddServices(services => { services.AddTransient(_ => provider.GetRequiredService>()); services.AddTransient(_ => provider.GetRequiredService>()); services.AddScoped(_ => provider.GetRequiredService()); services.AddScoped(_ => provider.GetRequiredService()); services.AddScoped(_ => provider.GetRequiredService()); services.AddTransient(_ => provider.GetRequiredService()); services.AddRange(proxy.Services); services.AddSingleton(new ComponentScope(configuration.Section)); }); builder.AddConfiguration(configuration.Section, configuration.Value); IComponentHost host = builder.Build(); scopes.Add(new ComponentScopeDescriptor(configuration.Section, host.Services.GetRequiredService())); vaults.Add(host); await host.StartAsync(); } } } }