(EDIT : Cette réponse se concentre uniquement sur "quelles sont les implications à un niveau relativement bas" plutôt que sur les implications globales de la conception. Il semble que d'autres réponses aient couvert ces aspects, je ne ferai donc pas de commentaire :)
Il y a certainement quelque chose qui ne va pas dans le code que vous avez donné, car rien ne ferme la connexion, la commande ou le lecteur. Plus précisément, votre ligne d'affectation de connexion devrait normalement ressembler à ceci :
using (SqlConnection connection = GetConnection())
{
...
}
Vous pouvez penser que ce n'est que du pinaillage, que ce n'est qu'un exemple de code et que le nettoyage n'a pas d'importance, mais la "propriété" des ressources qui sont utilisées dans le cadre de l'application de la directive est un élément essentiel de la politique de l'UE en matière de ressources. besoin Le nettoyage est précisément le problème que pose l'adoption d'une DataReader
à un constructeur.
Je pense qu'il n'y a pas de problème tant que l'on sait à qui appartient le lecteur par la suite. Par exemple, dans Image.FromStream
Dans certains cas, l'image est propriétaire du flux par la suite et peut ne pas apprécier que vous le fermiez vous-même (en fonction du format de l'image et de quelques autres facteurs). Dans d'autres cas, c'est toujours à vous qu'il incombe de fermer le flux. Cela doit être très soigneusement documenté, et si le type avec le constructeur prend la propriété, il doit implémenter IDisposable
pour faciliter le nettoyage et pour qu'il soit plus évident qu'un nettoyage est nécessaire.
Dans votre cas, il semble que le constructeur soit no s'approprier le lecteur, ce qui est une alternative tout à fait valable (et plus simple). Il suffit de documenter cela, et l'appelant devra toujours fermer le lecteur de manière appropriée.