using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.Configuration; namespace RAIC.Extensions.Configuration.EntityFrameworkCore.Extensions; public static class ConfigurationBuilderExtensions { public delegate DbContextOptionsBuilder DbContextOptionsTransformer(DbContextOptionsBuilder transform) where T : DbContext; /// /// Adds a off as a configuration provider to the . /// /// Type of the which implements /// Concrete type which implements /// /// a which configures your . eg. /// /// dbContextOptions => dbContextOptions.UseNpgsql(builder.Configuration.GetConnectionString("Default")) /// /// /// The public static IConfigurationBuilder AddDbSet(this IConfigurationBuilder builder, DbContextOptionsTransformer optionsTransformer) where TDbContext : DbContext, ISettingsDbContext, TSetting> where TSetting : class, ISetting { // DEBT: Find way to create non-pooled DbContextFactory since this is only a short lived usage var configurationSource = new EntityFrameworkCoreDbSetConfigurationSource() { DbContextFactory = new PooledDbContextFactory(optionsTransformer(new DbContextOptionsBuilder()).Options, poolSize: 1) }; return builder.Add(configurationSource); } }