public static IFunctionsWorkerApplicationBuilder AddFunctionsWorkerCore()

in src/DotNetWorker.Core/Hosting/ServiceCollectionExtensions.cs [36:115]


        public static IFunctionsWorkerApplicationBuilder AddFunctionsWorkerCore(this IServiceCollection services, Action<WorkerOptions>? configure = null)
        {
            if (services is null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            // Request handling
            services.TryAddSingleton<IFunctionsApplication, FunctionsApplication>();

            // Execution
            services.TryAddSingleton<IMethodInfoLocator, DefaultMethodInfoLocator>();
            services.TryAddSingleton<IFunctionInvokerFactory, DefaultFunctionInvokerFactory>();
            services.TryAddSingleton<IMethodInvokerFactory, DefaultMethodInvokerFactory>();
            services.TryAddSingleton<IFunctionActivator, DefaultFunctionActivator>();
            services.TryAddSingleton<IFunctionExecutor, DefaultFunctionExecutor>();

            // Function Execution Contexts
            services.TryAddSingleton<IFunctionContextFactory, DefaultFunctionContextFactory>();

            // Invocation Features
            services.TryAddSingleton<IInvocationFeaturesFactory, DefaultInvocationFeaturesFactory>();
            services.TryAddSingleton<IInvocationFeatureProvider, DefaultBindingFeatureProvider>();

            // Input conversion feature
            services.TryAddSingleton<IConverterContextFactory, DefaultConverterContextFactory>();
            services.TryAddSingleton<IInputConversionFeatureProvider, DefaultInputConversionFeatureProvider>();
            services.TryAddSingleton<IInputConverterProvider, DefaultInputConverterProvider>();

            // Input binding cache
            services.TryAddScoped<IBindingCache<ConversionResult>, DefaultBindingCache<ConversionResult>>();

            // Output Bindings
            services.TryAddSingleton<IOutputBindingsInfoProvider, DefaultOutputBindingsInfoProvider>();

            // Worker initialization service
            services.AddHostedService<WorkerHostedService>();

            // Default serializer settings
            services.AddOptions();
            services.TryAddEnumerable(ServiceDescriptor.Transient<IPostConfigureOptions<WorkerOptions>, WorkerOptionsSetup>());

            services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, WorkerLoggerProvider>());

            services.TryAddSingleton(NullLogWriter.Instance);
            services.TryAddSingleton<IUserLogWriter>(s => s.GetRequiredService<NullLogWriter>());
            services.TryAddSingleton<ISystemLogWriter>(s => s.GetRequiredService<NullLogWriter>());
            services.TryAddSingleton<IUserMetricWriter>(s => s.GetRequiredService<NullLogWriter>());
            services.TryAddSingleton<FunctionActivitySourceFactory>();

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

            IFunctionsWorkerApplicationBuilder builder = null!;

            // We want to ensure that if this is called multiple times, we use the same builder,
            // so we stash in the IServiceCollection for future calls to check.
            foreach (var descriptor in services)
            {
                if (descriptor.ServiceType == typeof(IFunctionsWorkerApplicationBuilder))
                {
                    builder = (IFunctionsWorkerApplicationBuilder)descriptor.ImplementationInstance!;
                    break;
                }
            }

            if (builder is null)
            {
                builder = new FunctionsWorkerApplicationBuilder(services);
                services.AddSingleton<IFunctionsWorkerApplicationBuilder>(builder);

                // Execute startup code from worker extensions if present
                // Only run this once when builder is first added.
                RunExtensionStartupCode(builder);
            }

            return builder;
        }