Example #1
0
        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);
        }