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

11

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 à une base de données.

J'ai pensé afin d'éviter de redéfinir le ConnectionStringet le SqlConnectiondans 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?

Ahmad
la source

Réponses:

10

Passer une connexion ouverte à chaque classe n'est probablement pas la meilleure idée. Lisez la section 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
            }
        }
    }
}
Gibson
la source
5

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 cela est déjà pris en charge par le pool de connexions en réutilisant les 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 la quantité 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();

            ...
        }
    } 
}
Richard Jansson
la source