Buenas prácticas con Dapper

asp.net-web-api c# dapper

Pregunta

Soy un principiante con Dapper y tengo algunas dudas sobre las mejores prácticas. Mi proyecto es Asp.net WebApi.

Apertura de la cadena de conexión

En este hilo, la conexión con la base de datos se abre así, dentro de Controller, pero es un proyecto simple, que no pretende ser un WebService:

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);  

Pero encontré otros ejemplos con el using declaración:

using (IDbConnection connection = new SqlConnection(stringConnection))
{
    //do something
}

Dado que este proyecto es un WebAPI la instrucción using sería mejor cu'z sería Dispose la solicitud?

Datos de listado

En el mismo hilo anterior, se muestra cómo recuperar una lista basada en static IDbConnection db propiedad de static IDbConnection db :

var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });

¿O sería mejor usar .AsList() ?

var res = connection.Query<ShippDetails>(query, new { id }).AsList();

La acción del controlador

Para toda mi acción, dice así:

[Route("FF")]
    [HttpGet]
    public async Task<HttpResponseMessage> get()
    {         
        var response = new HttpResponseMessage();
        int id = 1;

        var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });

        if (res.Count > 0)
        {
            response = Request.CreateResponse(HttpStatusCode.OK, res);
        }
        else
        {
            response = Request.CreateResponse(HttpStatusCode.NoContent);
        }          

        var task = new TaskCompletionSource<HttpResponseMessage>();
        task.SetResult(response);
        return await task.Task;
    }

Podría causar un poco de retraso? ¿O la forma en que manejo mi Acción es "buena"? ¡Gracias!

Respuesta aceptada

Usar using bloque es siempre la mejor práctica. Sin embargo, esto puede no ser aplicable en todos los casos. Como está utilizando WebApi, considere usar UnitOfWork si su transacción se extiende a través de múltiples clases o métodos. Refiera esta respuesta para la muestra del código en caso de que esté interesado.

using solo elimina el objeto que implementó IDisposable ; en su caso, una conexión de base de datos. No dispone la solicitud.

Sobre su segunda pregunta, AsList() debería ser una buena práctica .

Acerca de "Acción del controlador", no es bueno o malo. No veo ningún motivo para causar ningún retraso allí.


Respuesta popular

SqlConnection realidad se basa en un grupo de conexiones internas, por lo tanto, cuando las crea y las elimina, está obteniendo y regresando a la agrupación, excepto cuando no hay suficientes conexiones, por ejemplo, las primeras conexiones.

Por lo tanto, debe usar using con SqlConnection . En realidad, es peligroso usar una variable estática para mantener una conexión, ya que no se garantiza que los métodos de instancia de una conexión funcionen en varios subprocesos.

En cuanto a los datos que obtienes con Dapper, .AsList() forzará la transferencia de los resultados. Es una declaración clara de "Quiero los resultados en la memoria". Si no lo usa, puede obtener un IEnumerable<T> que se pone perezosamente en cada fila.

Con respecto a su controlador, está emitiendo el resultado de Query<T> a List<T> . Es posible que esto no funcione; debe seguir con .AsList() . Otra cosa es que en realidad no estás tomando ningún beneficio de async en tu controlador. Lo que debe hacer es var res = await db.QueryAsync<T>(...).AsList(); y simplemente return response; al final, TaskCompletionSource<T> es superfluo allí.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué