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