using System.Data.Common; using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; namespace Infrastructure.Repository.Sql; /// /// Default implementation that creates SQL Server connections, /// resolving the connection string from environment variables or application configuration. /// /// The application configuration, used as a fallback source for the connection string. public class DefaultSqlConnectionFactory(IConfiguration configuration) : ISqlConnectionFactory { private readonly string _connectionString = GetConnectionString( configuration ); /// /// Resolves the SQL Server connection string, preferring (in order): the DB_CONNECTION_STRING /// environment variable, a connection string built from individual DB_* environment variables /// via , and finally the "Default" /// connection string from . /// /// The application configuration to fall back to. /// The resolved SQL Server connection string. /// /// Thrown when no connection string can be resolved from any of the supported sources. /// private static string GetConnectionString(IConfiguration configuration) { // Check for full connection string first var fullConnectionString = Environment.GetEnvironmentVariable( "DB_CONNECTION_STRING" ); if (!string.IsNullOrEmpty(fullConnectionString)) { return fullConnectionString; } // Try to build from individual environment variables (preferred method for Docker) try { return SqlConnectionStringHelper.BuildConnectionString(); } catch (InvalidOperationException) { // Fall back to configuration-based connection string if env vars are not set var connString = configuration.GetConnectionString("Default"); if (!string.IsNullOrEmpty(connString)) { return connString; } throw new InvalidOperationException( "Database connection string not configured. Set DB_CONNECTION_STRING or DB_SERVER, DB_NAME, DB_USER, DB_PASSWORD env vars or ConnectionStrings:Default." ); } } /// /// Creates a new, unopened using the resolved connection string. /// /// A new instance. public DbConnection CreateConnection() { return new SqlConnection(_connectionString); } }