using Npgsql; using System.Data; namespace PlanTempus.Database.Core.ConnectionFactory { public class PostgresConnectionFactory : IDbConnectionFactory, IAsyncDisposable { private readonly NpgsqlDataSource _baseDataSource; private readonly Action _configureDataSource; private readonly Microsoft.Extensions.Logging.ILoggerFactory _loggerFactory; public PostgresConnectionFactory( string connectionString, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory = null, Action configureDataSource = null) { _loggerFactory = loggerFactory; _configureDataSource = configureDataSource ?? (builder => { }); // Opret base data source med konfiguration var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString); ConfigureDataSourceBuilder(dataSourceBuilder); _baseDataSource = dataSourceBuilder.Build(); } public IDbConnection Create() { return _baseDataSource.CreateConnection(); } public IDbConnection Create(string username, string password) { var connectionStringBuilder = new NpgsqlConnectionStringBuilder( _baseDataSource.ConnectionString) { Username = username, Password = password }; var tempDataSourceBuilder = new NpgsqlDataSourceBuilder( connectionStringBuilder.ToString()); ConfigureDataSourceBuilder(tempDataSourceBuilder); var tempDataSource = tempDataSourceBuilder.Build(); return tempDataSource.CreateConnection(); } private void ConfigureDataSourceBuilder(NpgsqlDataSourceBuilder builder) { if (_loggerFactory != null) { builder.UseLoggerFactory(_loggerFactory); } _configureDataSource?.Invoke(builder); } public async ValueTask DisposeAsync() { await _baseDataSource.DisposeAsync(); } } }