Sim, é seguro passar por uma conexão. Você lida com a conexão em um bloco de controle externo. Não há nada de inseguro nisso.
O que é inseguro é escrever um código que não garanta que a conexão seja descartada adequadamente em tempo hábil. Esquecer-se de limpar um recurso não tem relação com a distribuição. Você poderia escrever com a mesma facilidade o código que deixa uma conexão interrompida sem transmiti-lo a qualquer lugar.
No C ++, você está protegido pelo RAII se alocar na pilha ou usar ponteiros inteligentes. Em C #, faça uma regra rígida de que todos os objetos descartáveis (como conexões) sejam declarados em um bloco "using". Em Java, limpe com a lógica try-finally. Faça revisões de código em todo o código da camada de dados para garantir isso.
O caso de uso mais comum é quando você tem várias operações que podem ser combinadas em várias permutações. E cada uma dessas permutações precisa ser uma transação atômica (todas com êxito ou reversão). você deve passar a transação (e, portanto, a conexão correspondente) para todos os métodos.
Suponha que tenhamos muitas ações foobar () que podem ser combinadas de várias maneiras como transações atômicas.
//example in C#
//outer controlling block handles clean up via scoping with "using" blocks.
using (IDbConnection conn = getConn())
{
conn.Open();
using (IDbTransaction tran = conn.BeginTransaction())
{
try
{//inner foobar actions just do their thing. They don't need to clean up.
foobar1(tran);
foobar2(tran);
foobar3(tran);
tran.Commit();
}
catch (Exception ex)
{ tran.Rollback(); }
}
}//connection is returned to the pool automatically
BTW, você desejará abrir as conexões o mais tarde possível, descartá-las o mais rápido possível. Seus colegas de equipe podem estar certos se você estiver tratando as conexões como membros do objeto, introduzindo-as como um estado desnecessário e deixando as conexões abertas por muito mais tempo do que o necessário. Mas o ato de passar uma conexão ou transação como parâmetro não é inerentemente errado.
Entre. Dependendo do suporte do seu idioma às funções de primeira classe, você poderá executar uma lista de ações foobar (). Portanto, uma função pode lidar com todas as permutações das ações. Eliminando a duplicação do bloco de controle externo para cada permutação.