using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace Toolkit.Foundation; public class ComponentBuilder : IComponentBuilder { private readonly IHostBuilder hostBuilder; public string ContentRoot { get; set; } = "Local"; public string ConfigurationFile { get; set; } = "Settings.json"; private ComponentBuilder() { hostBuilder = new HostBuilder() .ConfigureServices((context, services) => { services.AddScoped(); services.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters?.Where(x => x is not null).ToArray()!))); services.AddSingleton(); //services.AddScoped(); //services.AddTransient(); //services.AddScoped(); //services.AddTransient(); //services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddScoped(); services.AddTransient(); //services.AddHandler(); //services.AddHandler(); }); } public static IComponentBuilder Create() => new ComponentBuilder(); public IComponentBuilder AddConfiguration(Action configurationDelegate) where TConfiguration : class, new() { TConfiguration configuration = new(); if (configurationDelegate is not null) { configurationDelegate(configuration); } AddConfiguration(typeof(TConfiguration).Name, configuration); return this; } public IComponentBuilder AddConfiguration(string section, TConfiguration? configuration = null) where TConfiguration : class, new() { hostBuilder.AddConfiguration(section, ConfigurationFile, configuration); return this; } public IComponentBuilder AddConfiguration(string section) where TConfiguration : class, new() { AddConfiguration(section, null); return this; } public IComponentBuilder AddServices(Action configureDelegate) { hostBuilder.ConfigureServices(configureDelegate); return this; } public IComponentHost Build() { hostBuilder .UseContentRoot(ContentRoot, true) .ConfigureAppConfiguration(config => { config.AddJsonFile(ConfigurationFile, true, true); }); IHost host = hostBuilder.Build(); return host.Services.GetRequiredService(); } }