2008-12-17 17 views
26

En todos mis proyectos hasta ahora, solía utilizar el patrón singleton para acceder a la configuración de la aplicación en toda la aplicación. Últimamente veo muchos artículos tratando de no utilizar el patrón singleton, porque este patrón no promueve la capacidad de prueba, también oculta la dependencia del componente. Mi pregunta es, ¿cuál es la mejor manera de almacenar la configuración de la aplicación, que es fácilmente accesible en toda la aplicación sin pasar el objeto de configuración por toda la aplicación?Singleton para la configuración de la aplicación

Gracias de antemano

Madhu

Respuesta

21

creo que una configuración de la aplicación es un excelente uso del patrón Singleton. Tiendo a utilizarlo yo mismo para evitar tener que volver a leer la configuración cada vez que quiero acceder a ella y porque me gusta que la configuración esté fuertemente tipada (es decir, no tenga que convertir valores que no sean cadenas cada vez). Normalmente incorporo algunos métodos de puerta trasera a mi Singleton para admitir la capacidad de prueba, es decir, la capacidad de inyectar una configuración XML para poder establecerla en mi prueba y la capacidad de destruir Singleton para que vuelva a crearse cuando sea necesario. Normalmente, estos son métodos privados a los que accedo a través de la reflexión para que se oculten de la interfaz pública.

EDIT Vivimos y aprendemos. Si bien creo que la configuración de la aplicación es uno de los pocos lugares para usar un Singleton, ya no hago esto. Normalmente, ahora crearé una interfaz y una implementación de clase estándar utilizando campos de respaldo estáticos Lazy<T> para las propiedades de configuración. Esto me permite tener el comportamiento de "inicializar una vez" para cada propiedad con un diseño mejor para la capacidad de prueba.

+3

1, la gente les encanta crear sus pequeñas reglas como "sólo una salida de un bucle" o "no únicos permitidos". Preferiría ser pragmático en lugar de dogmático ya que el dogma lleva a que las personas no puedan pensar por sí mismas. Si solo puede tener un objeto X, solo debería tener un objeto XConfig. – paxdiablo

+2

Tener una sola instancia de un objeto de configuración es bueno y deseable, pero no hace que usar un Singleton sea bueno.El uso de hacks como métodos específicos de prueba en tu clase real tampoco es bueno para el código limpio o las pruebas. – ColinD

1

Para esa situación específica, crearía un objeto de configuración y se lo pasaría a quienes lo necesitaran.

Dado que es la configuración, debe utilizarse solo en ciertas partes de la aplicación y no necesariamente debe ser omnipresente.

Sin embargo, si no ha tenido problemas al usarlos, y no quiere probarlo tan duro, debe continuar como lo hizo hasta hoy.

Lea la discusión sobre por qué se consideran dañinos. Creo que la mayoría de los problemas surgen cuando el singleton está reteniendo muchos recursos.

Para la configuración de la aplicación, creo que sería seguro mantenerlo como está.

5

Use la inyección de dependencia para inyectar el objeto de configuración individual en cualquier clase que lo necesite. De esta forma puede usar una configuración simulada para probar o lo que quiera ... no está saliendo explícitamente y recibiendo algo que necesita ser inicializado con los archivos de configuración. Con la inyección de dependencia, tampoco está pasando el objeto.

+0

Entonces, ¿en este caso el objeto de configuración seguirá siendo un singleton, pero el código usará una interfaz, en lugar de directamente la clase, y la implementación real será inyectada por Spring? Entonces podríamos inyectar un objeto falso para probar. ¿Es esto correcto? – stivlo

+0

@stivlo: Correcto, la instancia única sería administrada por el contenedor de inyección de dependencia (sea Spring, Guice o lo que sea) y el código podría usar una interfaz quizás, permitiéndole pasar una implementación que realice con la configuración que desea para pruebas. No necesariamente tiene que ser un simulacro ... podría ser la implementación real, solo con ajustes que usted mismo agrega en lugar de leer desde un archivo. – ColinD

+0

Así que, @ColinD, por favor tengan paciencia, el enfoque aquí no es que Singleton sea malo para sí mismo, podría ser apropiado, especialmente para la configuración de la aplicación o quizás para mantener un conjunto de conexiones, diría yo, pero puede volverse malo cuando la dependencia está oculta, entonces no vemos las dependencias de código. Establecer esta dependencia con un contenedor de inyección de dependencia lo hace explícito. Este tipo de conclusión es un poco diferente del dogma "evitar los únicos", ¿estarías de acuerdo con eso? – stivlo

0

El patrón singleton parece ser el camino a seguir. Aquí hay un Setting class que escribí que funciona bien para mí.

Cuestiones relacionadas