windsor tutorial c# castle-windsor

castle windsor c# tutorial



¿Por qué Castle Windsor se aferra a objetos transitorios? (3)

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 utilizando se está sujetando a los objetos. Estos objetos se declaran con el atributo lifestyle = "transient" en config xml.

He encontrado si pongo una llamada explícita a IWindsorContainer.Release(hangingObject) , que abandonará sus referencias.

Esto está causando un problema, no esperaba que con un objeto de estilo de vida transitorio, CastleWindsor guardara una referencia y efectivamente creara una fuga. Va a ser una tarea bastante mundana y propensa a errores al insertar llamadas de liberación explícitas en todos los lugares apropiados.

¿Has visto este problema y tienes alguna sugerencia de cómo evitarlo?


Creo que las respuestas aquí carecen de un punto vital, que este comportamiento se puede configurar de manera inmediata mediante políticas de lanzamiento, echa un vistazo a la documentación en el sitio del proyecto del castillo aquí .

En muchos escenarios, especialmente donde su contenedor existe durante toda la vida de la aplicación de alojamiento, y donde los componentes transitorios realmente no necesitan ser rastreados (porque usted está manejando la eliminación en su código de llamada o componente que ha sido inyectado con el servicio), entonces solo puede configurar la política de liberación a la implementación NoTrackingReleasePolicy y terminar con ella.

Antes de Castle v 1.0 creo que Component Burden se implementará / introducirá, lo que ayudará a aliviar algunos de estos problemas también en cuanto a la eliminación de dependencias inyectadas, etc.

Editar:

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

La carga del componente - Davy Brions

Además, la carga de componentes se implementa en la versión oficial 2.0 de Windsor Container.


Sin embargo, puede establecer un estilo de vida de singleton o transitorio en los objetos del contenedor. Los objetos Singleton que entiendo deben durar toda la vida de la aplicación, ¡pero no entiendo la utilidad de que este comportamiento sea el mismo para los transitorios!

Se pueden crear estilos de vida personalizados implementando ILifestyleManager . ¡Tal vez sea posible implementar esto de manera adecuada para crear un tipo de estilo de vida ReallyTransient !


Una cosa a tener en cuenta es que esto parece haberse arreglado en el Tronco del Castillo. En r5475, Hammett cambió la política de versiones predeterminada en MicroKernel a LifecycledComponentsReleasePolicy .