web-dev-qa-db-fra.com

Où mettre une connexion de base de données commune pour mes cours

J'ai plusieurs classes (référentiels) qui font la tâche de sauvegarder/récupérer certains objets dans/depuis la base de données; tous doivent établir une connexion avec une seule base de données.

J'ai pensé afin d'éviter de redéfinir le ConnectionString et le SqlConnection dans chaque classe, en leur passant une connexion ouverte. Alors, où/quand est le meilleur endroit/moment pour définir/ouvrir cette connexion et la transmettre aux classes?

Existe-t-il de meilleures approches/modèles pour avoir accès à cette ressource commune?

11
Ahmad

Passer une connexion ouverte à chaque classe n'est probablement pas la meilleure idée. Lisez Création de connexions à la base de données - Faites-le une fois ou pour chaque requête?

Il recommande d'ouvrir et de fermer la connexion pour chaque requête que vous souhaitez exécuter, plutôt que de passer la connexion ouverte à votre référentiel.

Vous pouvez essayer quelque chose comme ça pour vous aider à gérer vos connexions.

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
            }
        }
    }
}
10
Gibson

Avoir une connexion ouverte et la passer entre les classes est généralement une mauvaise idée. Bien sûr, l'ouverture d'une connexion est tout à fait un problème de performances, mais le pool de connexions prend déjà en charge la réutilisation des connexions déjà ouvertes. Une remarque cependant: attendez toujours aussi longtemps que possible pour appeler connection.Open(), en particulier dans le code multithread car cela affectera la connexion à votre méthode (ce qui augmentera potentiellement le nombre nécessaire de connexions ouvertes à la base de données).

Pour rendre vos classes aussi génériques que possible, je recommanderais d'avoir une classe de base exposant une méthode avec IDbConnection, et vos référentiels auront une implémentation plus générique.

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

            ...
        }
    } 
}
5
Richard Jansson