Dónde poner una conexión de base de datos común para mis clases

11

Tengo varias clases (repositorios) que hacen la tarea de guardar / recuperar algunos objetos en / desde la base de datos; Todos ellos necesitan establecer una conexión con una base de datos.

Pensé para evitar redefinir el ConnectionStringy el SqlConnectionen cada clase, pasando una conexión abierta a ellos. Entonces, ¿dónde / cuándo es el mejor lugar / hora para definir / abrir esa conexión y pasarla a las clases?

¿Existen mejores enfoques / patrones para tener acceso a este recurso común?

Ahmad
fuente

Respuestas:

10

Pasar una conexión abierta a cada clase probablemente no sea la mejor idea. Lea la sección Cómo crear conexiones de base de datos: ¿una vez o para cada consulta?

Recomienda abrir y cerrar la conexión por cada consulta que desee ejecutar, en lugar de pasar la conexión abierta a su repositorio.

Podría intentar algo como esto para ayudarlo a administrar sus conexiones.

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
fuente
5

Tener una conexión abierta y pasarla entre clases es generalmente una mala idea. Claro, abrir una conexión es un gran éxito en el rendimiento, pero el grupo de conexiones ya se encarga de eso al reutilizar las conexiones ya abiertas. Sin embargo, una observación: siempre espere el mayor tiempo posible para llamar connection.Open(), especialmente en código multiproceso, ya que esto asignará la conexión a su método (lo que aumentará potencialmente la cantidad necesaria de conexiones abiertas a la base de datos).

Para que sus clases sean lo más genéricas posible, recomendaría tener una clase base que exponga un método con IDbConnection, y sus repositorios tendrán una implementación más genérica.

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
fuente