using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public class ScopedServiceFactory(IServiceScopeFactory serviceScopeFactory, ICache cache) : IScopedServiceFactory where TScopedService : notnull { public (IServiceProvider, TScopedService) Create(params object?[] parameters) { if (serviceScopeFactory.CreateScope() is IServiceScope serviceScope) { IServiceProvider serviceProvider = serviceScope.ServiceProvider; if (serviceProvider.GetRequiredService() is IServiceFactory factory) { if (factory.Create(parameters) is TScopedService service) { serviceProvider.GetRequiredService>().Set(service); cache.Add(service, serviceProvider); foreach (IInitializationScoped initializationScoped in serviceProvider.GetServices()) { initializationScoped.Initialize(); } return (serviceProvider, service); } } } return default; } }