Pregunta corta sobre la mejor práctica: Si se inyecta un objeto A en otro objeto B, ¿debería el objeto B implementar IDisposable y desechar A cuando B está dispuesto?¿Se deben eliminar las propiedades inyectadas?
Respuesta
En general, diría que no; la naturaleza de la inyección de dependencia significa que el objeto inyectado no sabe mucho sobre el ciclo de vida de lo que se inyectó; hasta cierto punto, esta es la definición de inyección. Como tal, no creo que el objeto inyectado deba eliminar lo que fue inyectado; el código de inyección debe asumir la responsabilidad de conocer el ciclo de vida completo de todos los objetos que está inyectando, y debe poder disponer de ellos adecuadamente cuando se completen todas las operaciones en ellos, y no antes.
Creo que realmente terminaría siendo subjetivo.
Sería todas se reducen a, ¿Quién debe controlar el tiempo de vida del objeto A?
decir con objeto de instancia C y D también tienen el objeto A inyectada en ellos, en caso de que usted no quiere que el objeto B disponer del objeto A prematuramente.
Sin embargo, en algunos casos, cuando se conoce el tiempo de vida del objeto A debe terminar con B, es totalmente apropiado para que el objeto B Eliminar el objeto A.
Si se refiere al patrón dependency injection, me creo que depende del conocimiento en el Objeto B sobre la implementación del Objeto A. La razón para hacer una inyección de dependencia de este tipo es porque usted no sabe de antemano cómo se implementará el Objeto A y si requiere IDisposable. Lo único que sabes es la interfaz.
La adición de este comportamiento resultaría en acoplamiento apretado entre las dos clases, la OMI.
(edit: al responder, no me quedó claro que la pregunta era sobre IoC/DI; lo dejo aquí para referencia, pero mire primero la respuesta aceptada).
Si por "inyectar" Quiere decir que B
asume la propiedad de A
, entonces sí; ejemplo de esto sería cosas como StreamReader
.
Si sólo se utiliza A
por un tiempo (pero A
sigue viviendo más allá de B
) entonces no.
Algunas API permiten especificar (en el constructor) si la propiedad se debe asumir (es decir, si se debe limpiar el objeto inyectado). Un ejemplo de esto sería GZipStream
.
Mi 2p sería argumentar que A no debe desecharse cuando se dispone B. La idea de la inyección de dependencia es que no tiene que preocuparse por el comportamiento y el ciclo de vida de los objetos que está recibiendo, simplemente se los entregó.
Por otra parte usted quiere asegurarse el objeto se limpia tan pronto como lo es ya no es necesaria. ¿Tal vez crear un sistema de mini eventos para que pueda notificar que necesita ser eliminado? Supongo que depende del contexto realmente.
- 1. ¿Deben las interfaces definir propiedades?
- 2. ¿Deben modelarse las relaciones "to-many" como propiedades?
- 3. ¿Se deben voltear las texturas OpenGL?
- 4. Cuándo se deben usar las entidades HTML
- 5. Eliminar propiedades recursivamente
- 6. Cuando las propiedades de anidamiento que implementan INotifyPropertyChanged deben cambiar la propoción del objeto principal?
- 7. ¿Dónde se almacenan las propiedades. Configuración predeterminada?
- 8. ¿Las propiedades de mis actores de Scala deben marcarse como @volatile?
- 9. ¿Las excepciones se deben colocar en un paquete separado?
- 10. ¿Se deben calificar las invocaciones de los constructores estándar?
- 11. ¿Se deben evitar las llamadas consecutivas a `errno`?
- 12. ¿Cómo se deben escribir las notas de la versión?
- 13. RX Temas: ¿se deben evitar?
- 14. Cómo reducir el número de dependencias inyectadas en el controlador
- 15. cómo obtener dependencias inyectadas en constructores en Windows Forms
- 16. captadores y definidores deben y no deben hacer
- 17. System.StackOverflowException, cuando se establece ¿Se usan las propiedades?
- 18. ¿Mantiene las propiedades de mi componente cuando se cambian?
- 19. GLKView establece las propiedades dibujables
- 20. Las abstracciones no deben depender de los detalles. Los detalles deben depender de las abstracciones
- 21. ¿Deben reemplazarse las variables estáticas por enumeraciones?
- 22. Boost árbol de propiedades: Eliminar un nodo
- 23. ¿Las implementaciones IDisposable.Dispose() deben ser idempotentes?
- 24. ¿Las metaetiquetas deben estar codificadas en HTML?
- 25. ¿Deben localizarse las unidades de medida?
- 26. Casos raros donde se deben utilizar MACRO
- 27. Mockito, ¿Está probando un objeto que se basa en dependencias inyectadas (Spring)?
- 28. ¿Deben actualizarse las fechas de copyright?
- 29. ¿Las llaves JSON deben ser únicas?
- 30. SVN Carpetas predeterminadas: ¿se deben usar?
En ese caso, necesitaría algún tipo de recuento de referencias para que el objeto A no se elimine antes de que algunas clases lo utilicen. –