using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public class ComponentFactory(IServiceProvider provider, IProxyServiceCollection proxy, IComponentScopeCollection scopes) : IComponentFactory { public IComponentHost? Create(string key, TConfiguration? configuration = null, Action? builderDelegate = null, Action? servicesDelegate = null) where TComponent : IComponent where TConfiguration : class, new() { if (provider.GetRequiredService() is TComponent component) { IComponentBuilder builder = component.Configure(key); if (builderDelegate is not null) { builderDelegate(builder); } 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 NamedComponent(key)); if (servicesDelegate is not null) { servicesDelegate(services); } }); builder.AddConfiguration(key, configuration); IComponentHost host = builder.Build(); scopes.Add(new ComponentScopeDescriptor(key, host.Services.GetRequiredService())); return host; } return default; } }