Sì, è sicuro passare una connessione. Gestisci la connessione in un blocco di controllo esterno. Non c'è nulla di pericoloso.
Ciò che non è sicuro è scrivere codice che non garantisce che la connessione sia correttamente disposta in modo tempestivo. Dimenticare di ripulire una risorsa non è correlato a passarla in giro. Potresti anche scrivere facilmente il codice che lascia una connessione sospesa senza passarlo da nessuna parte.
In C ++, si è protetti da RAII se si allocano in pila o si utilizzano i puntatori intelligenti. In C # fai una dura regola che tutti gli oggetti usa e getta (come le connessioni) siano dichiarati in un blocco "using". In Java ripulisci con la logica try-finally. Avere revisioni del codice su tutto il codice del livello dati per garantire ciò.
Il caso d'uso più comune è quando si hanno diverse operazioni che possono essere combinate in molte permutazioni. E ciascuna di queste permutazioni deve essere una transazione atomica (tutte hanno successo o rollback). quindi è necessario passare la transazione (e quindi la connessione corrispondente) a tutti i metodi.
Supponiamo di avere molte azioni foobar () che possono essere combinate in vari modi come transazioni atomiche.
//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
A proposito, vorrai aprire le connessioni il più tardi possibile, eliminarle il prima possibile. I tuoi compagni di squadra potrebbero avere ragione se stai trattando le connessioni come membri dell'oggetto, introducendole come stato non necessario e lasciando le connessioni aperte molto più a lungo del necessario. Ma l'atto di passare una connessione o transazione come parametro non è intrinsecamente sbagliato.
BTW. A seconda del supporto della tua lingua per le funzioni di prima classe, puoi eseguire un elenco di azioni foobar (). Quindi una funzione potrebbe gestire tutte le permutazioni delle azioni. Eliminazione della duplicazione del blocco di controllo esterno per ogni permutazione.