2009-02-23 14 views
6

Usando el castillo de Windsor, tengo un componente configurado con el estilo de vida transitoria:Castle Windsor: ¿Mi componente transitorio será basura?

<component id="publish.mapping.default" 
        service="IMyService, MyAssembly" 
        type="MyServiceImplementation, Myassembly" 
        lifestyle="transient" /> 

que será utilizado como esto:

var service = container.Resolve<IMyService>(componentId); 
// service usage .... 
// service goes out of scope ... 

Mi pregunta es, será la instancia de servicio recolector de basura después de que se sale del alcance, o Castle Windsor se aferrará a una referencia? Encontré this similar question, eso implica que este último podría ser el caso, pero después de examinar los enlaces publicados allí, no estoy seguro de si la discusión se trata de aferrar a la referencia, o de asegurar que el objeto se elimine si implementa IDisposable. Mis objetos no necesitan ser eliminados.

Si Castle Windsor se aferra a la instancia, ¿hay alguna manera fácil de evitar esto (quizás por configuración)?

EDITAR
Parece, que necesito para establecer la política de seguimiento de la liberación. ¿Se puede configurar esto en el archivo de configuración xml, o necesita establecerse en el código? ¿Puede la política de seguimiento de versiones establecerse por componente?

Respuesta

9

De forma predeterminada, el contenedor contiene una referencia a sus objetos (incluso los transitorios).

Sin embargo, como notas @Bittercoder en Why does Castle Windsor hold onto transient objects?, puede change the release tracking policy. Parece que la elección de

LifecycledComponentsReleasePolicy:

var policy = container.Kernel.ReleasePolicy; 
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy; 

Pero desde que se hizo la pregunta, que parece haberse convertido en la política por defecto.

+0

Gracias. ¿Sabes si esto se puede configurar por componente? (Vea la edición de mi pregunta) – driis

+0

No lo creo. En realidad, no uso Castle (me gustaría), pero los documentos parecen sugerir que es Kernel-wide. No estoy seguro de si esto es lo correcto, pero podría ser posible agregar una política personalizada que preste atención a su tipo de componente ... –

+0

La configuración de una política de publicación es de contenedor completo. De hecho, hay documentación que especifica que la configuración de una política de lanzamiento es una de las primeras cosas que debe hacerse después de crear una instancia del contenedor. Si no se sigue esta regla, algunos de los componentes se crearán utilizando una política de publicación específica y otra utilizando una diferente. Esto podría provocar una alta probabilidad de causar pérdidas de memoria. – Chai

1

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.

+0

No se ha comprobado el origen, pero Reflector parece sugerir que este es realmente el caso en el constructor DefaultKernel. ¡Práctico para saber, gracias! – Gavin

+0

Entonces, ¿qué significa esto realmente? ¿Que la fuga no debería ser un problema con los transitorios? – Sinaesthetic

Cuestiones relacionadas