56 lines
1.8 KiB
C#
56 lines
1.8 KiB
C#
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<DatabaseOptions>()
|
|
?? 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;
|
|
}
|
|
}
|