public static IWebJobsBuilder AddWebJobs()

in src/Microsoft.Azure.WebJobs.Host/Hosting/WebJobsServiceCollectionExtensions.cs [42:161]


        public static IWebJobsBuilder AddWebJobs(this IServiceCollection services, Action<JobHostOptions> configure)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (configure != null)
            {
                services.Configure(configure);
            }

            // A LOT of the service registrations below need to be cleaned up
            // maintaining some of the existing dependencies and model we previously had, 
            // but this should be reviewed as it can be improved.
            services.TryAddSingleton<IExtensionRegistryFactory, DefaultExtensionRegistryFactory>();
            services.TryAddSingleton<IExtensionRegistry>(p => p.GetRequiredService<IExtensionRegistryFactory>().Create());

            // Type conversion
            services.TryAddSingleton<ITypeLocator, DefaultTypeLocator>();
            services.TryAddSingleton<IConverterManager, ConverterManager>();
            services.TryAddSingleton<IFunctionIndexProvider, FunctionIndexProvider>();
            services.TryAddSingleton<SingletonManager>();
            services.TryAddSingleton<IHostSingletonManager>(provider => provider.GetRequiredService<SingletonManager>());
            services.TryAddSingleton<SharedQueueHandler>();
            services.TryAddSingleton<FunctionExecutor>();
            services.TryAddSingleton<IFunctionExecutor>(x => x.GetRequiredService<FunctionExecutor>());
            services.TryAddSingleton<IFunctionActivityStatusProvider>(x => x.GetRequiredService<FunctionExecutor>());
            services.TryAddSingleton<IDrainModeManager, DrainModeManager>();
            services.TryAddSingleton<IJobHostContextFactory, JobHostContextFactory>();

            services.TryAddSingleton<ILoadBalancerQueue, InMemoryLoadBalancerQueue>();

            // Anybody can add IBindingProvider via DI. 
            // Consume the whole list via a CompositeBindingProvider
            services.TryAddSingleton<CompositeBindingProviderFactory>();
            services.TryAddSingleton<CompositeBindingProvider>(
                p => p.GetRequiredService<CompositeBindingProviderFactory>().Create());

            services.TryAddSingleton<ISharedContextProvider, SharedContextProvider>();

            services.TryAddSingleton<IJobHostMetadataProviderFactory, JobHostMetadataProviderFactory>();
            services.TryAddSingleton<IJobHostMetadataProvider>(p => p.GetService<IJobHostMetadataProviderFactory>().Create());
            services.TryAddSingleton<IHostIdProvider, DefaultHostIdProvider>();
            services.TryAddSingleton<IDashboardLoggingSetup, NullDashboardLoggingSetup>();
            services.TryAddSingleton<IFunctionOutputLogger, NullFunctionOutputLogger>();
            services.TryAddSingleton<IFunctionInstanceLogger, FunctionInstanceLogger>();
            services.TryAddSingleton<IHostInstanceLogger, NullHostInstanceLogger>();
            services.TryAddSingleton<IDistributedLockManager, InMemoryDistributedLockManager>();
            services.TryAddSingleton<IInstanceServicesProviderFactory, DefaultInstanceServicesProviderFactory>();

            services.AddCommonScaleServices();
            services.TryAddSingleton<IScaleMetricsRepository, NullScaleMetricsRepository>();

            services.AddSingleton<IPrimaryHostStateProvider, PrimaryHostStateProvider>();
            services.AddSingleton<IHostedService, PrimaryHostCoordinator>();

            // $$$ Can we remove these completely? 
            services.TryAddSingleton<DefaultTriggerBindingFactory>();
            services.TryAddSingleton<ITriggerBindingProvider>(p => p.GetRequiredService<DefaultTriggerBindingFactory>().Create());

            // Exception handler
            services.TryAddSingleton<IWebJobsExceptionHandlerFactory, DefaultWebJobsExceptionHandlerFactory>();
            services.TryAddSingleton<IWebJobsExceptionHandler>(p => p.GetRequiredService<IWebJobsExceptionHandlerFactory>().Create(p.GetRequiredService<IHost>()));

            services.TryAddSingleton<INameResolver, DefaultNameResolver>();
            services.TryAddSingleton<IJobActivator, DefaultJobActivator>();

            // Event collector
            services.TryAddEnumerable(ServiceDescriptor.Singleton<IEventCollectorProvider, FunctionResultAggregatorProvider>());
            services.TryAddSingleton<IEventCollectorFactory, EventCollectorFactory>();
            services.TryAddSingleton<IAsyncCollector<FunctionInstanceLogEntry>>(p => p.GetRequiredService<IEventCollectorFactory>().Create());

            // Core host services
            services.TryAddSingleton<IJobHost, JobHost>();

            // Configuration
            services.AddSingleton(typeof(IWebJobsExtensionConfiguration<>), typeof(WebJobsExtensionConfiguration<>));

            // Options logging
            services.AddOptionsLogging();
            // Concurrency management
            services.TryAddSingleton<IConcurrencyStatusRepository, NullConcurrencyStatusRepository>();
            services.TryAddSingleton<IHostProcessMonitor, DefaultHostProcessMonitor>();
            services.TryAddSingleton<IConcurrencyThrottleManager, DefaultConcurrencyThrottleManager>();
            services.TryAddEnumerable(ServiceDescriptor.Singleton<IConcurrencyThrottleProvider, HostHealthThrottleProvider>());
            services.TryAddEnumerable(ServiceDescriptor.Singleton<IConcurrencyThrottleProvider, ThreadPoolStarvationThrottleProvider>());
            services.TryAddSingleton<ConcurrencyManager>();
            services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, ConcurrencyManagerService>());

            AddListenerDecorators(services);

            services.ConfigureOptions<ConcurrencyOptionsSetup>();
            services.ConfigureOptions<PrimaryHostCoordinatorOptionsSetup>();
            services.AddOptions<ConcurrencyOptions>()
                .Configure<IConfiguration>((options, config) =>
                {
                    var section = config.GetWebJobsRootConfiguration().GetSection(ConcurrencyConfigSectionName);
                    section.Bind(options);
                });

            services.AddOptions<SingletonOptions>()
                .Configure<IHostingEnvironment>((options, env) =>
                {
                    if (env.IsDevelopment())
                    {
                        options.ListenerLockPeriod = TimeSpan.FromSeconds(15);
                    }
                })
                .Configure<IConfiguration>((options, config) =>
                {
                    var section = config.GetWebJobsRootConfiguration().GetSection(SingletonConfigSectionName);
                    section.Bind(options);
                });

            var builder = new WebJobsBuilder(services);
            builder.AddBuiltInBindings();

            return builder;
        }