Dove mettere una connessione di database comune per le mie classi

9

Ho diverse classi (Archivi) che svolgono il compito di salvare / recuperare alcuni oggetti in / dal database; tutti devono stabilire una connessione a un database.

Ho pensato di evitare di ridefinire ConnectionString e SqlConnection in ogni classe, passando una connessione aperta con loro. Allora dove / quando è il miglior posto / tempo per definire / aprire quella connessione e passarla alle classi?

Esistono approcci / modelli migliori per accedere a questa risorsa comune?

    
posta Ahmad 28.04.2015 - 07:00
fonte

2 risposte

9

Passare una connessione aperta a ciascuna classe non è probabilmente l'idea migliore. Leggi Creazione di connessioni al database - Esegui una volta o per ogni query?

Raccomanda di aprire e chiudere la connessione per ogni query che desideri eseguire, piuttosto che passare la connessione aperta al tuo repository.

Potresti provare qualcosa di simile per aiutarti nella gestione delle connessioni.

public class Repository
{
    private readonly string _connectionString;

    public Repository()
    {
        _connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
    }

    protected SqlConnection GetConnection()
    {
         return new SqlConnection(_connectionString);
    }


}

public sealed class UserRespository : Repository
{

    public User GetUsers()
    {
        using (var connection = GetConnection())
        {
            using (var commnad = new SqlCommand("SqlQuery", connection))
            {
                //Execute Query
                //Return results
            }
        }
    }
}
    
risposta data 28.04.2015 - 09:32
fonte
4

Avere una connessione aperta e passarla tra le classi è generalmente una cattiva idea. Certo, aprire una connessione è un bel colpo di performance, ma questo è già gestito dal pool di connessioni riutilizzando le connessioni già aperte. Un'osservazione però: aspetta sempre il più a lungo possibile per chiamare connection.Open() , specialmente nel codice multithread poiché questo assegnerà la connessione al tuo metodo (che aumenterà potenzialmente la quantità necessaria di connessioni aperte al database).

Per rendere le tue classi il più generiche possibile, ti consiglio di fare in modo che una classe base esponga un metodo con IDbConnection e i tuoi repository avranno un'implementazione più generica.

internal abstract class Repository
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;

    protected IDbConnection GetConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

public class MyRepository : Repository
{
    public IEnumerable<object> Get()
    {
        using (var connection = GetConnection())
        {
            connection.Open();

            ...
        }
    } 
}
    
risposta data 28.04.2015 - 10:50
fonte

Leggi altre domande sui tag