Onde colocar uma conexão de banco de dados comum para minhas classes

11

Eu tenho várias classes (Repositórios) que fazem a tarefa de salvar / recuperar alguns objetos no / do banco de dados; todos eles precisam estabelecer uma conexão com um banco de dados.

Eu pensei que, a fim de evitar a redefinir o ConnectionStringeo SqlConnectionem cada classe, passando uma conexão aberta com eles. Então, onde / quando é o melhor local / horário para definir / abrir essa conexão e passá-la para as classes?

Existem melhores abordagens / padrões para ter acesso a esse recurso comum?

Ahmad
fonte

Respostas:

10

Passar uma conexão aberta para cada classe provavelmente não é a melhor idéia. Leia sobre Criando conexões com o banco de dados - Faça uma vez ou para cada consulta?

Ele recomenda abrir e fechar a conexão por cada consulta que você deseja executar, em vez de passar a conexão aberta ao seu repositório.

Você pode tentar algo assim para ajudá-lo a gerenciar suas conexões.

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

Ter uma conexão aberta e transmiti-la entre classes geralmente é uma má ideia. Claro, a abertura de uma conexão é um problema de desempenho, mas isso já é resolvido pelo pool de conexões reutilizando as conexões já abertas. Uma observação, no entanto: sempre espere o máximo possível para chamar connection.Open(), especialmente em código multithread, pois isso atribuirá a conexão ao seu método (o que aumentará potencialmente a quantidade necessária de conexões abertas ao banco de dados).

Para tornar suas classes o mais genéricas possível, eu recomendaria ter uma classe base expondo um método com IDbConnection, e seus repositórios terão uma implementação mais 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
fonte