using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using StellaOps.Policy.Determinization.Scoring; namespace StellaOps.Policy.Determinization; /// /// Service registration for Determinization subsystem. /// public static class ServiceCollectionExtensions { /// /// Registers determinization services with default options. /// /// Service collection /// Service collection for chaining public static IServiceCollection AddDeterminization(this IServiceCollection services) { return services.AddDeterminization(_ => { }); } /// /// Registers determinization services with the DI container. /// /// Service collection /// Configuration root (for options binding) /// Service collection for chaining public static IServiceCollection AddDeterminization( this IServiceCollection services, IConfiguration configuration) { // Register options services.AddOptions() .Bind(configuration.GetSection(DeterminizationOptions.SectionName)) .ValidateOnStart(); // Register scoring calculators (both interface and concrete for flexibility) services.TryAddSingleton(); services.TryAddSingleton(sp => sp.GetRequiredService()); services.TryAddSingleton(); services.TryAddSingleton(sp => sp.GetRequiredService()); services.TryAddSingleton(); return services; } /// /// Registers determinization services with custom options. /// public static IServiceCollection AddDeterminization( this IServiceCollection services, Action configureOptions) { services.AddOptions() .Configure(configureOptions) .ValidateOnStart(); // Register scoring calculators (both interface and concrete for flexibility) services.TryAddSingleton(); services.TryAddSingleton(sp => sp.GetRequiredService()); services.TryAddSingleton(); services.TryAddSingleton(sp => sp.GetRequiredService()); services.TryAddSingleton(); return services; } }