public static void AddWebJobsScriptHost()

in src/WebJobs.Script.WebHost/WebHostServiceCollectionExtensions.cs [75:239]


        public static void AddWebJobsScriptHost(this IServiceCollection services, IConfiguration configuration)
        {
            services.AddHttpContextAccessor();
            services.AddResponseCompression(options =>
            {
                options.EnableForHttps = true;
                // Brotli and Gzip compression providers are added by default.
                // Compression defaults to Brotli when the Brotli format is supported by the client
            });
            services.AddWebJobsScriptHostRouting();

            services.AddMvc(o =>
            {
                o.EnableEndpointRouting = false;
                o.Filters.Add(new ArmExtensionResourceFilter());
            })
            .AddNewtonsoftJson()
            .AddXmlDataContractSerializerFormatters();

            // Standby services
            services.AddStandbyServices();

            services.AddSingleton<IScriptHostManager>(s => s.GetRequiredService<WebJobsScriptHostService>());
            services.AddSingleton<IScriptWebHostEnvironment, ScriptWebHostEnvironment>();
            services.TryAddSingleton<IStandbyManager, StandbyManager>();
            services.TryAddSingleton<IServiceCollection>(services);
            services.TryAddSingleton<IScriptHostBuilder, DefaultScriptHostBuilder>();

            // Metrics
            services.AddSingleton<IHostMetricsProvider, HostMetricsProvider>();
            services.AddSingleton<IHostMetrics, HostMetrics>();

            // Linux container services
            services.AddLinuxContainerServices();

            // ScriptSettingsManager should be replaced. We're setting this here as a temporary step until
            // broader configuration changes are made:
            services.AddSingleton<ScriptSettingsManager>();
            services.AddSingleton<IEventGenerator>(p =>
            {
                var environment = p.GetService<IEnvironment>();
                if (environment.IsAnyLinuxConsumption())
                {
                    var consoleLoggingOptions = p.GetService<IOptions<ConsoleLoggingOptions>>();
                    return new LinuxContainerEventGenerator(environment, consoleLoggingOptions);
                }
                else if (SystemEnvironment.Instance.IsLinuxAppService())
                {
                    var hostNameProvider = p.GetService<HostNameProvider>();
                    IOptions<FunctionsHostingConfigOptions> functionsHostingConfigOptions = p.GetService<IOptions<FunctionsHostingConfigOptions>>();
                    IOptions<AzureMonitorLoggingOptions> azureMonitorOptions = p.GetService<IOptions<AzureMonitorLoggingOptions>>();
                    return new LinuxAppServiceEventGenerator(new LinuxAppServiceFileLoggerFactory(), hostNameProvider, functionsHostingConfigOptions, azureMonitorOptions);
                }
                else if (environment.IsAnyKubernetesEnvironment())
                {
                    return new KubernetesEventGenerator();
                }
                else
                {
                    return new EtwEventGenerator();
                }
            });

            // Management services
            services.AddSingleton<IFunctionsSyncManager, FunctionsSyncManager>();
            services.AddSingleton<IFunctionMetadataManager, FunctionMetadataManager>();
            services.AddSingleton<IWebFunctionsManager, WebFunctionsManager>();
            services.AddHttpClient();
            services.AddSingleton<StartupContextProvider>();
            services.AddSingleton<IFileSystem>(_ => FileUtility.Instance);
            services.AddTransient<VirtualFileSystem>();
            services.AddTransient<VirtualFileSystemMiddleware>();

            if (SystemEnvironment.Instance.IsFlexConsumptionSku())
            {
                services.AddSingleton<IInstanceManager, LegionInstanceManager>();
            }
            else
            {
                // Default IInstanceManager
                services.AddSingleton<IInstanceManager, AtlasInstanceManager>();
            }

            // Logging and diagnostics
            services.AddSingleton<IMetricsLogger, WebHostMetricsLogger>();
            if (!FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagDisableDiagnosticEventLogging))
            {
                services.AddSingleton<ILoggerProvider, DiagnosticEventLoggerProvider>();
                services.TryAddSingleton<IDiagnosticEventRepository, DiagnosticEventTableStorageRepository>();
                services.TryAddSingleton<IDiagnosticEventRepositoryFactory, DiagnosticEventRepositoryFactory>();
            }

            // Secret management
            services.TryAddSingleton<ISecretManagerProvider, DefaultSecretManagerProvider>();

            // Shared memory data transfer and function data cache
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                services.AddSingleton<IMemoryMappedFileAccessor, MemoryMappedFileAccessorWindows>();
            }
            else
            {
                services.AddSingleton<IMemoryMappedFileAccessor, MemoryMappedFileAccessorUnix>();
            }
            services.AddSingleton<ISharedMemoryManager, SharedMemoryManager>();
            services.AddSingleton<IFunctionDataCache, FunctionDataCache>();

            // Grpc
            services.AddScriptGrpc();

            // Register common services with the WebHost
            // Language Worker Hosted Services need to be intialized before WebJobsScriptHostService
            ScriptHostBuilderExtensions.AddCommonServices(services);

            services.AddSingleton<IWorkerFunctionMetadataProvider, WorkerFunctionMetadataProvider>();
            services.AddSingleton<IHostFunctionMetadataProvider, HostFunctionMetadataProvider>();
            services.AddSingleton<IFunctionMetadataProvider, FunctionMetadataProvider>();

            // Core script host services
            services.AddSingleton<WebJobsScriptHostService>();
            services.AddSingleton<IHostedService>(s => s.GetRequiredService<WebJobsScriptHostService>());

            // Performs function assembly analysis to generete log use of unoptimized assemblies.
            services.AddSingleton<IHostedService, AssemblyAnalyzer.AssemblyAnalysisService>();

            // Performs checks to see if the sas token within the urls are expired.
            services.AddSingleton<IHostedService, Health.TokenExpirationService>();

            // Manages a diagnostic listener that subscribes to diagnostic sources setup in the host
            // and persists events in the logging infrastructure.
            services.AddSingleton<IHostedService, DiagnosticListenerService>();

            // Handles shutdown of services that need to happen after StopAsync() of all services of type IHostedService are complete.
            // Order is important.
            // All other IHostedService injections need to go before this.
            services.AddSingleton<IHostedService, HostedServiceManager>();

            // Configuration

            // ScriptApplicationHostOptions are special in that they need to be reset on specialization, but the reset
            // must happen after the StandbyOptions have reset. For this reason, we have a special ChangeTokenSource that
            // will reset the ScriptApplicationHostOptions only after StandbyOptions have been reset.
            services.ConfigureOptions<ScriptApplicationHostOptionsSetup>();
            services.AddSingleton<IOptionsChangeTokenSource<ScriptApplicationHostOptions>, ScriptApplicationHostOptionsChangeTokenSource>();
            services.ConfigureOptions<StandbyOptionsSetup>();
            services.ConfigureOptions<LanguageWorkerOptionsSetup>();
            services.ConfigureOptionsWithChangeTokenSource<AppServiceOptions, AppServiceOptionsSetup, SpecializationChangeTokenSource<AppServiceOptions>>();
            services.ConfigureOptionsWithChangeTokenSource<HttpBodyControlOptions, HttpBodyControlOptionsSetup, SpecializationChangeTokenSource<HttpBodyControlOptions>>();
            services.ConfigureOptionsWithChangeTokenSource<ResponseCompressionOptions, ResponseCompressionOptionsSetup, SpecializationChangeTokenSource<ResponseCompressionOptions>>();
            services.ConfigureOptions<FlexConsumptionMetricsPublisherOptionsSetup>();
            services.ConfigureOptions<LinuxConsumptionLegionMetricsPublisherOptionsSetup>();
            services.ConfigureOptions<ConsoleLoggingOptionsSetup>();
            services.ConfigureOptions<AzureMonitorLoggingOptionsSetup>();
            services.AddHostingConfigOptions(configuration);
            services.ConfigureOptions<ExtensionRequirementOptionsSetup>();

            // Refresh LanguageWorkerOptions when HostBuiltChangeTokenSource is triggered.
            services.ConfigureOptionsWithChangeTokenSource<LanguageWorkerOptions, LanguageWorkerOptionsSetup, HostBuiltChangeTokenSource<LanguageWorkerOptions>>();

            services.TryAddSingleton<IDependencyValidator, DependencyValidator>();
            services.TryAddSingleton<IJobHostMiddlewarePipeline>(s => DefaultMiddlewarePipeline.Empty);

            // Add AzureBlobStorageProvider to WebHost (also needed for ScriptHost) and AzureTableStorageProvider
            services.AddAzureStorageProviders();
        }