J'utilise dapper dans ma solution ASP.NET WebForms.
Toutes mes classes qui traitent des données récupèrent une connexion ouverte à partir de cette classe de base
public abstract class SalesDb : IDisposable
{
protected static IDbConnection OpenConnection()
{
IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SalesDb"].ConnectionString);
connection.Open();
return connection;
}
public void Dispose()
{
OpenConnection().Dispose();
}
}
Exemple de classe de service qui utilise cette classe de base
public class LeadService : SalesDb
{
public IEnumerable<LeadDto> Select()
{
using (IDbConnection connection = OpenConnection())
{
return connection.Query<LeadDto>("Lead_Select",
null, null, true, null, CommandType.StoredProcedure);
}
}
}
Y at-il un inconvénient que la méthode OpenConnection(
) dans la classe de base est statique et renvoie une nouvelle instance pour chaque appel?
Vous créez une nouvelle connexion dans dispose? Cela ne marchera pas! Utilisez une boucle simple avec plus de 100 itérations (la taille maximale du pool par défaut est 100) et vous verrez probablement des types d'exceptions ( trop de connexions ouvertes , ExecuteReader nécessite une connexion ouverte et disponible, etc.).
En tout cas, je m'attends à de sérieux problèmes de performances car le pool doit créer de nouvelles connexions physiques consécutives.
Je ne réinventerais pas le pool de connexion . Mon conseil est: n'utilisez pas cette classe, d'autant plus dans asp.net.
Ne pas pocher sur le territoire du Pool de connexion ;-)
Mais notez que vous pouvez répondre à ces deux questions avec Non . La méthode statique ne pose pas de problème (contrairement à une connexion statique) et ne renvoie pas toujours une nouvelle connexion (car le pool renverrait des connexions qui ne sont pas utilisées actuellement). Mais le principal problème de votre classe est la dispose
qui crée des connexions et les ouvre.