IOC y servicios sin estado. De corta duración o de una sola instancia?

7

Dado un marco de recolección de elementos no utilizados, cuando se usa un contenedor IOC para inyectar servicios sin estado, en general es mejor usar la vida útil de una sola instancia del contenedor o recrear el objeto cada vez que se usa y lanzar, y todo su ¿Dependencias, lejos tan pronto como termines con ellas?

    
pregunta pdr 07.12.2012 - 18:14

3 respuestas

5

Usted menciona que su servicio tiene dependencias.

Si alguna dependencia en su gráfico de dependencias no es completamente sin estado, o si una de sus dependencias en su gráfico de dependencias debería modificarse para que ya no sea tan completamente sin estado, entonces todo el sistema fallará. Y los errores que obtenga probablemente serán muy crípticos, lo que dificultará el descubrimiento del problema.

Digamos que eres un equipo de desarrolladores que trabajan en el proyecto. Es muy poco probable que todos y cada uno de ellos estén conscientes de que la configuración de IOC requiere que todos estos componentes permanezcan completamente sin estado. Pueden saberlo ahora, pero esa conciencia se desvanecerá con el tiempo. Y si contrata a un nuevo tipo, él / ella tampoco lo sabrá.

Así que definitivamente configuraría el contenedor IOC para devolver una nueva instancia cada vez. Es simplemente la opción más segura, imho.

Ciertamente no me preocuparía por los recursos. El costo de la construcción y la recolección de basura de objetos es probablemente insignificante en comparación con, por ejemplo, solo una búsqueda de base de datos.

    
respondido por el Pete 15.01.2013 - 18:00
3

La única instancia fue el comportamiento predeterminado de Spring por un motivo: una única instancia de un servicio sin estado consumirá menos recursos que la creación constante y la recolección de elementos no utilizados de muchas instancias. Además, no existe ningún peligro real en compartir un servicio sin estado, pero existen algunos problemas reales de escalabilidad al crear múltiples instancias de un servicio.

Por lo tanto, diría que lo más probable es que la única instancia sea tu amigo.

    
respondido por el Matthew Flynn 07.12.2012 - 21:16
0

Sin más contexto, creo que realmente no importa.

Puede obtener los beneficios de los objetos de corta duración de una sola instancia, si esa instancia simplemente crea los objetos de corta duración para cada llamada, y puede obtener los beneficios de una sola instancia de muchos objetos de corta duración, si esos simplemente actúan como flyweights .

Por supuesto, es innecesariamente ruidoso configurarlo de una manera, solo para delegar en el opuesto. Por lo tanto, supongo que debería tener una conjetura, si es probable que agregue un estado, y si es así, si va a ser un estado persistente / global (por ejemplo, al agregar un caché) o un estado de corta duración / local.

    
respondido por el back2dos 07.12.2012 - 19:14

Lea otras preguntas en las etiquetas