using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation; namespace Bitvault; public class VaultFactory(IServiceProvider provider, IProxyServiceCollection proxy, IComponentScopeCollection scopes, IVaultHostCollection vaults) : IVaultFactory { public IComponentHost? Create(string name, VaultConfiguration configuration) { 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(name)); }); builder.AddConfiguration(name, configuration); IComponentHost host = builder.Build(); scopes.Add(new ComponentScopeDescriptor(name, host.Services.GetRequiredService())); vaults.Add(host); return host; } return default; } }