Pregunta

Recientemente, noté que mi aplicación parece estar comiendo memoria que nunca se libera. Después de perfilar con CLRProfiler, descubrí que el contenedor de Castle Windsor que estoy usando se aferra a objetos. Estos objetos se declaran con el estilo de vida = " transitorio " atributo en la configuración xml.

Encontré si puse una llamada explícita a IWindsorContainer.Release (hangingObject) , que eliminará sus referencias.

Sin embargo, esto está causando un problema, no esperaba que con un objeto de estilo de vida transitorio CastleWindsor mantuviera una referencia y creara una fuga de manera efectiva. Va a ser una tarea bastante mundana y propensa a errores que consiste en insertar llamadas de lanzamiento explícitas en todos los lugares apropiados.

¿Has visto este problema y tienes alguna sugerencia sobre cómo solucionarlo?

¿Fue útil?

Solución

Creo que las respuestas aquí faltan un punto vital: que este comportamiento se puede configurar de manera inmediata a través de las políticas de lanzamiento. Consulte la documentación en el sitio del proyecto Castle aquí .

En muchos escenarios, especialmente donde existe su contenedor durante toda la vida útil de la aplicación de hospedaje, y donde realmente no es necesario rastrear los componentes transitorios (porque está manejando la eliminación en su código de llamada o componente que se ha inyectado con el servicio) ) luego, solo puede configurar la política de lanzamiento a la implementación NoTrackingReleasePolicy y terminar con ella.

Antes de Castle v 1.0, creo que la carga de componentes se implementará / introducirá, lo que ayudará a aliviar algunos de estos problemas, así como la eliminación de dependencias inyectadas, etc.

Editar:

Consulte las siguientes publicaciones para obtener más información sobre la carga de los componentes.

La carga de componentes - Davy Brions

También la carga de componentes se implementa en versión oficial 2.0 del Windsor Container.

Otros consejos

Una cosa a tener en cuenta es que esto parece haberse solucionado en Castle Trunk. En r5475, Hammett cambió la política de lanzamiento predeterminada en MicroKernel a LifecycledComponentsReleasePolicy .

Puede establecer un estilo de vida de singleton o transitorio en objetos en el contenedor. Los objetos Singleton que entiendo deberían durar toda la vida de la aplicación, ¡pero no entiendo la utilidad de este comportamiento siendo el mismo para los transitorios!

Se pueden crear estilos de vida personalizados implementando ILifestyleManager . ¡Quizás sea posible implementar esto adecuadamente para crear un tipo de estilo de vida ReallyTransient !

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top