using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace Toolkit.Foundation; public class DefaultHostBuilder : HostBuilder { public static IHostBuilder Create(Action builderDelegate) { HostBuilder hostBuilder = new(); hostBuilder.ConfigureServices((context, services) => { services.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters?.Where(x => x is not null).ToArray()!))); services.AddSingleton(); services.AddSingleton(); services.AddScoped(); services.AddTransient(); services.AddTransient(); services.AddScoped>(provider => new ProxyService(provider.GetRequiredService())); services.AddScoped>(provider => new ProxyService(provider.GetRequiredService())); services.AddScoped>(provider => new ProxyService(provider.GetRequiredService())); services.AddTransient(); services.AddScoped(); services.AddTransient(); services.AddScoped(); services.AddTransient>(provider => Comparer.Create((x, z) => StringComparer.CurrentCultureIgnoreCase.Compare(x.Key, z.Key))); Scoped named = new("Root"); services.AddSingleton>(provider => { ScopedServiceDescriptor descriptor = new(); descriptor.Set(named); return descriptor; }); services.AddSingleton(provider => provider.GetRequiredService>().Value!); services.AddSingleton>(provider => { Cache cache = new(provider.GetRequiredService>()) { { named, provider } }; return cache; }); services.AddTransient(provider => provider.GetService>()!.Select(x => x.Value)); services.AddTransient, ScopedServiceProvider>(); services.AddTransient, ScopedServiceFactory>(); //services.AddScoped(provider => //[ // new ComponentScopeDescriptor("Root", provider.GetRequiredService()) //]); //services.AddTransient(); //services.AddTransient(); services.AddScopedHandler(); services.AddScopedHandler(); services.AddTransient(); //services.AddInitialization(); }); builderDelegate.Invoke(hostBuilder); hostBuilder.ConfigureServices((context, services) => { services.AddHostedService(); }); return hostBuilder; } }