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;
}