Il modo in cui strutturo normalmente le applicazioni consiste nel disporre di tutti gli accessi al database in una DLL (modulo per altre lingue). Tutti i metodi di accesso ai dati accettano una stringa di connessione come parametro (nel caso di EF è un po 'diverso ma viene comunque passato in base alla stringa di connessione in app.config o web.config dell'applicazione primaria).
In questo modo il DAL (Data Access Layer) conosce la struttura del database ma non conosce alcun dettaglio di connessione. Significa che è possibile scambiare la stringa di connessione in fase di esecuzione per connettersi a DEV, UAT o PROD. La struttura di base di un metodo DAL sarebbe simile a questa:
Public SomeType GetData(string connectionString)
{
try
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("", sqlConnection))
{
sqlConnection.Open();
cmd.CommantText = "SomeSqlHere";
SomeType returnVal = //Code to get your data and map to your return type
return returnVal;
}
}
catch (Exception ex)
{
Log.Error("Caught error.", ex);
throw;
}
}
Gli interni sarebbero un po 'diversi per EF, ma nel complesso l'uso di Dependency Injection consente di salvare stringhe di connessione hardcode in vari punti.
Per quanto riguarda l'iniezione della stringa di connessione, normalmente ho una classe Configuration che legge e talvolta memorizza nella cache i valori di configurazione. Questa configurazione ha assunto molte forme e si è evoluta in base alle esigenze dell'applicazione specifica su cui sto lavorando. La chiamata a un metodo dati sembrerebbe GetDate(Config.GetConnectionString())
. Quindi, solo una posizione nell'applicazione deve sapere qual è la stringa di connessione e in quale altro luogo viene passata.