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