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