using Core.Blueprint.Mongo; using Core.Blueprint.Mongo.Configuration; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace Core.Blueprint.DAL.Mongo.Configuration { /// /// The class contains extension methods for registering the MongoDB context and configuration settings /// to the in the dependency injection container. /// public static class RegisterBlueprint { /// /// Adds the MongoDB layer services to the . /// Registers the MongoDB context and configuration settings for MongoDB connection, database name, and audience. /// /// The to which the services will be added. /// The used to load MongoDB settings. /// The updated with MongoDB services registered. public static IServiceCollection AddMongoLayer(this IServiceCollection services, IConfiguration configuration) { var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; services.AddSingleton(); var ConnectionString = configuration.GetSection("ConnectionStrings:MongoDB").Value ?? string.Empty; var Databasename = configuration.GetSection("MongoDb:DatabaseName").Value ?? string.Empty; var Audience = (environment == "Local") ? configuration.GetSection("MongoDb:LocalAudience").Value : configuration.GetSection("MongoDb:Audience").Value; if (string.IsNullOrEmpty(ConnectionString) || string.IsNullOrEmpty(Databasename) || string.IsNullOrEmpty(Audience)) throw new InvalidOperationException("Mongo connection is not configured correctly."); services.Configure(options => { options.ConnectionString = ConnectionString; options.Databasename = Databasename; options.Audience = Audience; }); services.AddSingleton(serviceProvider => { var settings = serviceProvider.GetRequiredService>().Value; var mongoClientSettings = MongoClientSettings.FromConnectionString(settings.ConnectionString); mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new AzureIdentityProvider(settings.Audience)); return new MongoClient(mongoClientSettings); }); services.AddSingleton(serviceProvider => { var settings = serviceProvider.GetRequiredService>().Value; var client = serviceProvider.GetRequiredService(); return client.GetDatabase(settings.Databasename); }); services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); return services; } } }