using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public class ScopedServiceFactory(IServiceScopeFactory serviceScopeFactory, ICache cache) : IScopedServiceFactory where TScopedService : notnull { public (IServiceScope, 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, serviceScope); foreach (IInitializationScoped initializationScoped in serviceScope.ServiceProvider.GetServices()) { initializationScoped.Initialize(); } return (serviceScope, service); } } } return default; } }