Hay muchas preguntas sobre si los singleton son "malos" y qué patrones usar en su lugar. En general, se centran en el patrón de diseño singleton, que implica recuperar la instancia singleton de un método estático en la clase. Esta no es una de esas preguntas.Estoy usando Dependency Injection: ¿qué tipos debo enlazar como singletons?
Desde que realmente "descubrí" la inyección de dependencia hace varios meses, he impulsado su adopción en nuestro equipo, eliminando patrones estáticos y únicos de nuestro código a lo largo del tiempo, y usando inyección basada en constructor siempre que sea posible. Hemos adoptado convenciones para que no tengamos que seguir agregando enlaces explícitos a nuestros módulos DI. Incluso utilizamos el marco DI para proporcionar instancias de registrador, de modo que podamos decirle automáticamente a cada registrador en qué clase está sin código adicional. Ahora que tengo un solo lugar donde puedo controlar cómo se enlazan los distintos tipos, es muy fácil determinar cuál debería ser el ciclo de vida de una categoría particular de clases (clases de utilidad, repositorios, etc.).
Mi pensamiento inicial fue que probablemente habría algunas ventajas para las clases vinculantes como singleton si esperaba que se utilizaran con bastante frecuencia. Simplemente significa que hay mucho menos new
en curso, especialmente cuando el objeto que está creando termina teniendo un gran árbol de dependencias. Casi todos los campos no estáticos en cualquiera de estas clases son esos valores que se inyectan en el constructor, por lo que hay relativamente poca carga de memoria para mantener una instancia cuando no se está utilizando.
Luego leí "Singleton, te amo, pero me estás derribando" en www.codingwithoutcomments.com, y me hizo preguntarme si tenía la idea correcta. Después de todo, Ninject compila las funciones de creación de objetos por defecto, por lo que hay muy poca sobrecarga de reflexión involucrada en la creación de instancias adicionales de estos objetos. Debido a que estamos manteniendo la lógica comercial fuera del constructor, crear nuevas instancias es una operación realmente liviana. Y los objetos no tienen un montón de campos no estáticos, por lo que tampoco hay mucha sobrecarga de memoria involucrada en la creación de nuevas instancias.
Por lo tanto, en este punto, estoy empezando a pensar que probablemente no importe mucho de ninguna manera. ¿Hay consideraciones adicionales que no he tenido en cuenta? ¿Alguien realmente ha experimentado una mejora significativa en el rendimiento al cambiar los ciclos de vida de ciertos tipos de objetos? ¿Seguir el patrón DI es la única cosa realmente importante, o hay otras razones por las que el uso de una sola instancia de un objeto puede ser intrínsecamente "malo"?
+1 para responder la pregunta que se hizo. – StriplingWarrior