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