public GenerateCommand(IGenerator generator, IConsole console, FetcherTypeCollection fetcherTypeCollection, IServiceProvider serviceProvider)
 {
     Generator             = generator ?? throw new ArgumentNullException(nameof(generator));
     Console               = console ?? throw new ArgumentNullException(nameof(console));
     FetcherTypeCollection = fetcherTypeCollection ?? throw new ArgumentNullException(nameof(fetcherTypeCollection));
     ServiceProvider       = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
 }
        public static IServiceCollection AddFetchers(this IServiceCollection services, params Assembly[] assemblies)
        {
            var typeOfIFetcher = typeof(IFetcher);
            var typeOfFetchShortNameAttribute = typeof(FetchShortNameAttribute);

            var fetchTypeCollection = new FetcherTypeCollection(
                assemblies.Select(s => s.DefinedTypes)
                .SelectMany(s => s)
                .Where(w => w.CustomAttributes.Any(a => a.AttributeType == typeOfFetchShortNameAttribute))
                .Where(w => w.ImplementedInterfaces.Contains(typeOfIFetcher))
                .Where(w => !w.IsInterface)
                .Where(w => !w.IsAbstract)
                .ToList());

            services.AddSingleton(fetchTypeCollection);

            foreach (var type in fetchTypeCollection)
            {
                services.AddScoped(type.Value);
            }

            return(services);
        }