Tout le monde semble ouvrir ses connexions beaucoup trop tôt ? Je me suis posé la même question, et après avoir consulté la source ici - https://github.com/StackExchange/dapper-dot-net/blob/master/Dapper/SqlMapper.cs
Vous constaterez que chaque interaction avec la base de données vérifie si la connexion est fermée et l'ouvre si nécessaire. Pour cette raison, nous utilisons simplement les instructions using comme ci-dessus sans conn.open(). De cette manière, la connexion est ouverte le plus près possible de l'interaction. Si vous le remarquez, la connexion est également fermée immédiatement. Cela sera également plus rapide que la fermeture automatique lors de l'élimination.
L'un des nombreux exemples tirés de la base de données ci-dessus :
private static int ExecuteCommand(IDbConnection cnn, ref CommandDefinition command, Action<IDbCommand, object> paramReader)
{
IDbCommand cmd = null;
bool wasClosed = cnn.State == ConnectionState.Closed;
try
{
cmd = command.SetupCommand(cnn, paramReader);
if (wasClosed) cnn.Open();
int result = cmd.ExecuteNonQuery();
command.OnCompleted();
return result;
}
finally
{
if (wasClosed) cnn.Close();
cmd?.Dispose();
}
}
Voici un petit exemple de l'utilisation d'un wrapper pour Dapper appelé DapperWrapper. Cela nous permet d'envelopper toutes les méthodes de Dapper et de Simple Crud pour gérer les connexions, assurer la sécurité, la journalisation, etc.
public class DapperWrapper : IDapperWrapper
{
public IEnumerable<T> Query<T>(string query, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
{
using (var conn = Db.NewConnection())
{
var results = conn.Query<T>(query, param, transaction, buffered, commandTimeout, commandType);
// Do whatever you want with the results here
// Such as Security, Logging, Etc.
return results;
}
}
}