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; } /// /// Configura automaticamente il servizio di scoperta database in base al tipo di database /// /// Tipo di database public void ConfigureDatabaseDiscovery(DatabaseType databaseType) { switch (databaseType) { case DatabaseType.SqlServer: DatabaseDiscoveryService = new SqlServerDatabaseDiscovery(); break; // case DatabaseType.MySql: // DatabaseDiscoveryService = new MySqlDatabaseDiscovery(); // break; // Altri tipi di database possono essere aggiunti qui default: throw new NotSupportedException($"Tipo di database non supportato: {databaseType}"); } } /// /// 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}"; } } }