2010-09-17 8 views
9

Estoy escribiendo una aplicación que crea un "Catálogo" de archivos, que puede atribuirse a otros archivos de metadatos como archivos adjuntos y miniaturas.Quién debería ser responsable de cerrar una secuencia

Estoy tratando de abstraer la interfaz de un catálogo hasta el punto en que un consumidor de un catálogo no necesita saber sobre el sistema de archivos subyacente utilizado para almacenar los archivos. Así que he creado una interfaz llamada IFileSystemAdaptor que se muestra a continuación.

public interface IFileSystemAdaptor:IDisposable 
{ 
    void WriteFileData(string fileName, Stream data); 
    Stream ReadFileData(string filename); 
    void DeleteFileData(string filename); 
    void ClearAllData(); 
    void WriteMetaFileData(string filename, string path, Stream data); 
    Stream ReadMetaFileData(string filename, string path); 
    void DeleteMetaFileData(string filename, string path); 
    void ClearMetaFilesData(string filename); 
} 

Esencialmente mi interfaz IFileSystemAdaptor expone una lista plana de archivos, que también puede estar asociado con los archivos adicionales de metadatos.

Como puede ver, estoy usando referencias a objetos genéricos Stream para abstraer la interfaz de los datos de un archivo. De esta forma, una implementación de un catálogo podría devolver archivos desde un disco duro, mientras que otra podría devolver los datos desde un servidor web.

Ahora estoy tratando de averiguar cómo evitar que mi programa deje las transmisiones abiertas. ¿Existe una regla de oro para los miembros que deben cerrar las transmisiones? Si el consumidor de un flujo lo cierra, o el miembro que creó el flujo original será responsable de cerrarlo.

Respuesta

14

mis reglas:

caso de que el consumo de una corriente cerrarla

  1. Si vuelvo un flujo de un método, el consumidor es responsable. Te lo estoy dando, es tu responsabilidad.

  2. Si acepto un flujo como parámetro en un método, no lo cierro. Al salir del método, no sé si el método de llamada todavía lo necesita. Es tu transmisión, solo la estoy tomando prestada, y no quiero echarte a perder.

  3. Si creo una secuencia y la paso a otro método, mi método la cierra (o lo intenta) cuando termino con ella. No sé qué vas a hacer con él, pero es mi transmisión, así que soy responsable de eso.

+0

¡Gran respuesta! ¡Gracias! –

+0

Generalmente un buen conjunto de reglas, aunque agregaría una cuarta: al aceptar un flujo (u otro 'IDisposable') en un constructor o método de fábrica, si el objeto construido puede sobrevivir a cualquier otra persona que realmente conozca el flujo encapsulado/objeto, uno debe proporcionar una * opción * para que el método 'Dispose' del objeto construido también elimine el flujo/objeto encapsulado. – supercat

2

Mi pensamiento espontáneo en este caso es que el consumidor debe tener la responsabilidad de cerrar las transmisiones. Un IFileSystemAdaptor no puede saber cuándo el consumidor finalizó la transmisión, por lo que tampoco puede decidir cuándo cerrarlo.

1

En efecto, el último objeto para usar la secuencia debe ser responsable de cerrarlo, y eso es generalmente lo que llama.

¡Disfrútalo!

Cuestiones relacionadas