Dove mettere una connessione al database comune per le mie lezioni


11

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

Ho pensato per evitare di ridefinire il ConnectionStringe il SqlConnectionin ogni classe, passando una connessione aperta a loro. Allora dove / quando è il posto / orario migliore per definire / aprire quella connessione e passarla alle classi?

Esistono approcci / modelli migliori per avere accesso a questa risorsa comune?

Risposte:


10

Passare una connessione aperta a ogni classe non è probabilmente la migliore idea. Leggi la sezione Creazione di connessioni al database: esegui una volta o per ogni query?

Si consiglia di aprire e chiudere la connessione per ogni query che si desidera eseguire, piuttosto che passare la connessione aperta al proprio repository.

Potresti provare qualcosa del genere per aiutarti a gestire le tue 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
            }
        }
    }
}

5

Avere una connessione aperta e passarla tra le classi è generalmente una cattiva idea. Certo, l'apertura di una connessione è piuttosto un successo, ma questo è già curato dal pool di connessioni riutilizzando connessioni già aperte. Un'osservazione però: attendi sempre il più a lungo possibile per chiamare connection.Open(), specialmente nel codice multithread poiché questo assegnerà la connessione al tuo metodo (che aumenterà in modo intenzionale la quantità necessaria di connessioni aperte al database).

Per rendere le tue classi il più generiche possibile, consiglierei di avere una classe base che esponga un metodo con IDbConnection e che 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();

            ...
        }
    } 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.