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();
...
}
}
}