using System;
using Microsoft.EntityFrameworkCore;
using DataConnection.Interfaces;
using DataConnection.EF.DatabaseDiscovery;
using DataConnection.Enums;
namespace DataConnection.EF;
///
/// Opzioni per la configurazione del manager di database esistenti
///
public class DbManagerOptions
{
///
/// Configuratore del DbContext
///
public Action DbContextConfigurator { get; set; }
///
/// Configuratore del modello del database
///
public Action ModelConfigurator { get; set; }
///
/// Flag che indica se la scoperta automatica delle entità è abilitata
///
public bool EnableAutoDiscovery { get; set; }
///
/// Assembly da cui caricare automaticamente le entità (se EnableAutoDiscovery = true)
///
public System.Reflection.Assembly EntityAssembly { get; set; }
///
/// Namespace in cui cercare le entità (se EnableAutoDiscovery = true)
///
public string EntityNamespace { get; set; }
///
/// Timeout per le operazioni del database (in secondi)
///
public int CommandTimeout { get; set; } = 30;
///
/// Strategia di mappatura dei nomi (CamelCase, PascalCase, SnakeCase)
///
public NamingStrategy NamingStrategy { get; set; } = NamingStrategy.Default;
///
/// Servizio per la scoperta dei database disponibili sul server
///
public IDatabaseDiscovery DatabaseDiscoveryService { get; set; }
///
/// Stringa di connessione a livello di server (senza specificare il database)
///
public string ServerConnectionString { get; set; }
///
/// Nome del database a cui connettersi
///
public string DatabaseName { get; set; }
///
/// Tipo di database (SqlServer, MySql, ecc.)
///
public DatabaseType DatabaseType { get; set; } = DatabaseType.SqlServer; ///
/// Configura automaticamente il servizio di scoperta database in base al tipo di database
///
/// Tipo di database
public void ConfigureDatabaseDiscovery(DatabaseType databaseType)
{
DatabaseType = databaseType;
switch (databaseType)
{
case DatabaseType.SqlServer:
DatabaseDiscoveryService = new SqlServerDatabaseDiscovery();
DbContextConfigurator = options => options.UseSqlServer(BuildFullConnectionString(),
sqlOptions => sqlOptions.CommandTimeout(CommandTimeout));
break;
case DatabaseType.Odbc:
// Per ODBC non c'è un provider EF Core specifico, useremo connessioni dirette
// Il DatabaseDiscoveryService può essere null per ODBC
DatabaseDiscoveryService = null!;
DbContextConfigurator = options =>
{
// ODBC non ha un provider EF Core nativo, quindi configuriamo un provider generico
// Le query verranno eseguite tramite connessioni dirette ADO.NET
};
break;
default:
// Per altri database, configuriamo un configuratore di base che non fa nulla
// Il test di connessione userà un approccio diverso
DbContextConfigurator = options => { };
break;
}
}
///
/// Costruisce una stringa di connessione completa includendo il database selezionato
///
public string BuildFullConnectionString()
{
if (string.IsNullOrEmpty(ServerConnectionString))
{
throw new InvalidOperationException("La stringa di connessione al server non è stata specificata");
}
if (string.IsNullOrEmpty(DatabaseName))
{
return ServerConnectionString;
}
// Per SQL Server
if (ServerConnectionString.Contains("Initial Catalog=") || ServerConnectionString.Contains("Database="))
{
// Sostituisci il database esistente
var modifiedString = System.Text.RegularExpressions.Regex.Replace(
ServerConnectionString,
@"(Initial Catalog|Database)=([^;]*)",
$"$1={DatabaseName}");
return modifiedString;
}
else
{
// Aggiungi il database
return ServerConnectionString + $";Database={DatabaseName}";
}
}
}