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