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