Oui, il est possible de contourner une connexion. Vous gérez la connexion dans un bloc de contrôle externe. Il n'y a rien de dangereux à cela.
Ce qui n'est pas sûr, c'est d'écrire du code qui ne garantit pas que la connexion est correctement éliminée en temps opportun. Oublier de nettoyer une ressource n'est pas lié à sa transmission. Vous pouvez tout aussi facilement écrire du code qui laisse une connexion suspendue sans la faire passer n'importe où.
En C ++, vous êtes protégé par RAII si vous allouez sur la pile ou utilisez des pointeurs intelligents. En C #, établissez une règle stricte selon laquelle tous les objets jetables (tels que les connexions) doivent être déclarés dans un bloc "using". En Java, nettoyez avec la logique try-finally. Ayez des revues de code sur tout le code de la couche de données pour vous en assurer.
Le cas d'utilisation le plus courant est lorsque vous avez plusieurs opérations qui peuvent être combinées dans de nombreuses permutations. Et chacune de ces permutations doit être une transaction atomique (toutes réussissent ou annulent). vous devez ensuite transmettre la transaction (et donc la connexion correspondante) à toutes les méthodes.
Supposons que nous ayons de nombreuses actions foobar () qui peuvent être combinées de diverses manières en tant que transactions atomiques.
//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, vous voudrez ouvrir les connexions le plus tard possible, les éliminer dès que possible. Vos coéquipiers pourraient avoir raison si vous traitez les connexions en tant que membres d'objet, en les présentant comme un état inutile et en laissant les connexions ouvertes beaucoup plus longtemps que nécessaire. Mais l'acte de passer une connexion ou une transaction en tant que paramètre n'est pas intrinsèquement mauvais.
BTW. Selon la prise en charge de votre langue pour les fonctions de première classe, vous pouvez effectuer une liste d'actions foobar (). Une seule fonction peut donc gérer toutes les permutations des actions. Élimination de la duplication du bloc de contrôle externe pour chaque permutation.