internal static (ServiceRegistry, AssemblyScanner[]) ExplodeSynchronously(IServiceCollection services) { var scanners = new AssemblyScanner[0]; var registry = new ServiceRegistry(services); var registriesEncountered = new List <Type>(); while (registry.HasScanners()) { var(registry2, operations) = ParseToOperations(registry, registriesEncountered); var additional = operations.OfType <AssemblyScanner>().ToArray(); registry = registry2; scanners = scanners.Concat(additional).ToArray(); registry.RemoveAll(x => x.ServiceType == typeof(AssemblyScanner)); Task.WhenAll(additional.Select(x => x.TypeFinder)).Wait(TimeSpan.FromSeconds(2)); foreach (var operation in operations) { if (operation is AssemblyScanner scanner) { scanner.ApplyRegistrations(registry); } if (operation is ServiceDescriptor[] descriptors) { registry.AddRange(descriptors); } } } return(registry, scanners); }