using Microsoft.Extensions.DependencyInjection; using StellaOps.Policy.Engine.Storage.Mongo.Internal; using StellaOps.Policy.Engine.Storage.Mongo.Migrations; using StellaOps.Policy.Engine.Storage.Mongo.Options; using StellaOps.Policy.Engine.Storage.Mongo.Repositories; namespace StellaOps.Policy.Engine.Storage.Mongo; /// /// Extension methods for registering Policy Engine MongoDB storage services. /// public static class ServiceCollectionExtensions { /// /// Adds Policy Engine MongoDB storage services to the service collection. /// /// The service collection. /// Optional configuration action for PolicyEngineMongoOptions. /// The service collection for chaining. public static IServiceCollection AddPolicyEngineMongoStorage( this IServiceCollection services, Action? configure = null) { ArgumentNullException.ThrowIfNull(services); // Register options if (configure is not null) { services.Configure(configure); } // Register context (singleton for connection pooling) services.AddSingleton(); // Register migrations services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Register migration runner services.AddSingleton(); // Register initializer services.AddSingleton(); // Register dynamic collection initializer for effective findings services.AddSingleton(); // Register repositories services.AddSingleton(); return services; } /// /// Adds Policy Engine MongoDB storage services with configuration binding from a configuration section. /// /// The service collection. /// Configuration section containing PolicyEngineMongoOptions. /// The service collection for chaining. public static IServiceCollection AddPolicyEngineMongoStorage( this IServiceCollection services, Microsoft.Extensions.Configuration.IConfigurationSection configuration) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configuration); services.Configure(configuration); return services.AddPolicyEngineMongoStorage(configure: null); } }