Hay dos escenarios distintos:
- Su objeto es dado una referencia de objeto a utilizar, ya sea a través de un argumento del constructor o una propiedad, y este objeto implementa IDisposable.
- Su objeto construye una instancia de un objeto que implementa IDisposable.
En el segundo caso, su objeto es responsable de los recursos involucrados, por lo que su objeto debe implementar IDisposable, y cuando se deseche, debe deshacerse del objeto que construyó.
Su DbConnection corresponde a este segundo caso, entonces sí, su objeto debería implementar IDisposable, y luego desechar la conexión.
En el primer caso, debe decidir en los siguientes tres soluciones:
- Su objeto sólo hace referencia a un objeto externo. Su objeto no debe deshacerse de este objeto externo. No necesita implementar IDisposable para este caso (es decir, para este objeto específico, si también internamente construye un objeto desechable, vuelve al segundo caso anterior).
- Su objeto se hace responsable del objeto externo. En este caso, vuelves al segundo caso, aunque tu objeto no fue el que construyó este objeto externo. Aquí implementa IDisposable y se deshace del objeto que le asignan.
- Implementa una forma para que el mundo exterior le diga cuál de las dos primeras soluciones debe elegir. Por ejemplo, un constructor puede tener una conexión, y un argumento booleano (o idealmente un valor enum) que le dice al constructor si su objeto ahora posee la conexión suministrada. Aquí también debe implementar IDisposable, pero en el método Dispose, debe verificar la propiedad y solo deshacerse de la conexión suministrada si es su propietario.
Eso fue una gran cantidad de texto, así que vamos a resumir:
- objetos de su propiedad, tiene que desechar.
- Objetos que no tiene, no los desecha.
También hay un tercer caso, que no parece que tenga, pero no obstante.
En el caso en el que la construcción, uso y descarte, un objeto localmente, dentro de un único método, sin pasar alrededor o almacenarlo en los campos de la clase, se utiliza la instrucción using
lugar, como este:
using (IDbConnection conn = ....())
{
}
¿No es curioso entonces que DataSet.Dispose() no se encargue de Dispose() sus DataTables? – Nariman
Esto realmente debería manejarse mucho mejor con el lenguaje: tener que encadenar IDisposable/Dispose a lo largo de una jerarquía de clases es absurdo y tedioso. – nicodemus13