using CRAWLER.Configuration; using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; namespace CRAWLER.Services; internal interface IDatabaseConnectionFactory { SqlConnection CreateConnection(); SqlConnection CreateMasterConnection(); DatabaseOptions Options { get; } } internal sealed class SqlServerConnectionFactory : IDatabaseConnectionFactory { public SqlServerConnectionFactory(IConfiguration configuration) { Options = configuration.GetSection("Database").Get() ?? throw new InvalidOperationException("Раздел Database не найден в appsettings.json."); } public DatabaseOptions Options { get; } public SqlConnection CreateConnection() { return new SqlConnection(BuildConnectionString(Options.Database)); } public SqlConnection CreateMasterConnection() { return new SqlConnection(BuildConnectionString("master")); } private string BuildConnectionString(string databaseName) { var builder = new SqlConnectionStringBuilder { ApplicationName = Options.ApplicationName, DataSource = Options.Server, InitialCatalog = databaseName, ConnectTimeout = Options.ConnectTimeoutSeconds, Encrypt = Options.Encrypt, IntegratedSecurity = Options.IntegratedSecurity, MultipleActiveResultSets = Options.MultipleActiveResultSets, Pooling = Options.Pooling, MaxPoolSize = Options.MaxPoolSize, MinPoolSize = Options.MinPoolSize, TrustServerCertificate = Options.TrustServerCertificate, ConnectRetryCount = Options.ConnectRetryCount, ConnectRetryInterval = Options.ConnectRetryIntervalSeconds }; return builder.ConnectionString; } }