private static void AddLinuxContainerServices()

in src/WebJobs.Script.WebHost/WebHostServiceCollectionExtensions.cs [271:386]


        private static void AddLinuxContainerServices(this IServiceCollection services)
        {
            if (SystemEnvironment.Instance.IsLinuxConsumptionOnLegion())
            {
                services.AddLinuxConsumptionMetricsServices();
            }

            services.AddSingleton<IHostedService>(s =>
            {
                var environment = s.GetService<IEnvironment>();
                if (environment.IsLinuxConsumptionOnAtlas())
                {
                    var instanceManager = s.GetService<IInstanceManager>();
                    var logger = s.GetService<ILogger<AtlasContainerInitializationHostedService>>();
                    var startupContextProvider = s.GetService<StartupContextProvider>();
                    return new AtlasContainerInitializationHostedService(environment, instanceManager, logger, startupContextProvider);
                }
                else if (environment.IsFlexConsumptionSku() || environment.IsLinuxConsumptionOnLegion())
                {
                    var instanceManager = s.GetService<IInstanceManager>();
                    var logger = s.GetService<ILogger<LegionContainerInitializationHostedService>>();
                    var startupContextProvider = s.GetService<StartupContextProvider>();
                    return new LegionContainerInitializationHostedService(environment, instanceManager, logger, startupContextProvider);
                }

                return NullHostedService.Instance;
            });

            services.AddSingleton<IMetricsPublisher>(s =>
            {
                var environment = s.GetService<IEnvironment>();
                if (environment.IsLinuxConsumptionOnLegion())
                {
                    var options = s.GetService<IOptions<LinuxConsumptionLegionMetricsPublisherOptions>>();
                    var logger = s.GetService<ILogger<LinuxContainerLegionMetricsPublisher>>();
                    var metricsTracker = s.GetService<ILinuxConsumptionMetricsTracker>();
                    var standbyOptions = s.GetService<IOptionsMonitor<StandbyOptions>>();
                    var serviceProvider = s.GetService<IServiceProvider>();
                    var hostingConfigOptions = s.GetService<IOptionsMonitor<FunctionsHostingConfigOptions>>();
                    return new LinuxContainerLegionMetricsPublisher(environment, standbyOptions, options, logger, new FileSystem(), metricsTracker, serviceProvider, hostingConfigOptions);
                }
                else if (environment.IsFlexConsumptionSku())
                {
                    var options = s.GetService<IOptions<FlexConsumptionMetricsPublisherOptions>>();
                    var standbyOptions = s.GetService<IOptionsMonitor<StandbyOptions>>();
                    var logger = s.GetService<ILogger<FlexConsumptionMetricsPublisher>>();
                    var metricsProvider = s.GetService<IHostMetricsProvider>();
                    return new FlexConsumptionMetricsPublisher(environment, standbyOptions, options, logger, new FileSystem(), metricsProvider);
                }
                else if (environment.IsLinuxMetricsPublishingEnabled())
                {
                    var logger = s.GetService<ILogger<LinuxContainerMetricsPublisher>>();
                    var standbyOptions = s.GetService<IOptionsMonitor<StandbyOptions>>();
                    var hostNameProvider = s.GetService<HostNameProvider>();
                    var hostingConfigOptions = s.GetService<IOptionsMonitor<FunctionsHostingConfigOptions>>();
                    return new LinuxContainerMetricsPublisher(environment, standbyOptions, logger, hostNameProvider, hostingConfigOptions);
                }

                return NullMetricsPublisher.Instance;
            });

            services.AddSingleton<IMeshServiceClient>(s =>
            {
                var environment = s.GetService<IEnvironment>();
                if (environment.IsAnyLinuxConsumption())
                {
                    var httpClientFactory = s.GetService<IHttpClientFactory>();
                    var logger = s.GetService<ILogger<MeshServiceClient>>();
                    return new MeshServiceClient(httpClientFactory, environment, logger);
                }

                return NullMeshServiceClient.Instance;
            });

            services.AddSingleton<LinuxContainerActivityPublisher>(s =>
            {
                var environment = s.GetService<IEnvironment>();
                if (environment.IsAnyLinuxConsumption())
                {
                    var logger = s.GetService<ILogger<LinuxContainerActivityPublisher>>();
                    var meshInitServiceClient = s.GetService<IMeshServiceClient>();
                    var standbyOptions = s.GetService<IOptionsMonitor<StandbyOptions>>();
                    return new LinuxContainerActivityPublisher(standbyOptions, meshInitServiceClient, environment, logger);
                }

                return null;
            });

            services.AddSingleton<IHostedService>(s =>
            {
                var environment = s.GetService<IEnvironment>();
                if (environment.IsAnyLinuxConsumption())
                {
                    return s.GetRequiredService<LinuxContainerActivityPublisher>();
                }

                return NullHostedService.Instance;
            });

            services.AddSingleton<ILinuxContainerActivityPublisher>(s =>
            {
                var environment = s.GetService<IEnvironment>();
                if (environment.IsAnyLinuxConsumption())
                {
                    return s.GetRequiredService<LinuxContainerActivityPublisher>();
                }

                return NullLinuxContainerActivityPublisher.Instance;
            });

            services.AddSingleton<IRunFromPackageHandler, RunFromPackageHandler>();
            services.AddSingleton<IPackageDownloadHandler, PackageDownloadHandler>();
            services.AddSingleton<IManagedIdentityTokenProvider, ManagedIdentityTokenProvider>();
            services.AddSingleton<IUnZipHandler, UnZipHandler>();
            services.AddSingleton<IBashCommandHandler, BashCommandHandler>();
        }