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