Fábrica IDbConnection usando Dapper

asp.net c# dapper

Pregunta

Estoy usando dapper en mi solución ASP.NET WebForms.

Todas mis clases que manejan datos recuperan una conexión abierta de esta clase 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();
    }
}

Ejemplo de una clase de servicio que usa esta clase 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);
        }
    }
}

¿Hay alguna desventaja de que el método OpenConnection( ) en la clase base sea estático y devuelva una nueva instancia para cada llamada?

Respuesta aceptada

¿Estás creando una nueva conexión en dispose? ¡Eso no funcionará! Use un bucle simple con más de 100 iteraciones (el tamaño máximo de la agrupación predeterminada es 100) y es probable que vea algún tipo de excepción ( demasiadas conexiones abiertas , ExecuteReader requiere una conexión abierta y disponible, etc.).

En cualquier caso, espero serios problemas de rendimiento ya que el grupo necesita crear nuevas conexiones físicas consecutivamente.

No reinventaría Connection-Pool . Mi consejo es: no utilices esa clase, mucho más en asp.net.

No busques en el territorio de Connection-Pool ;-)

Pero tenga en cuenta que ambas preguntas pueden responderse con No. El método estático no es un problema (a diferencia de una conexión estática) y tampoco siempre devuelve una nueva conexión (ya que el grupo devolvería las conexiones que actualmente no están en uso). Pero el problema principal de su clase es el dispose que crea conexiones y las abre.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow