2012-03-06 7 views
5

Estoy utilizando Castle-Windsor como contenedor en una aplicación de Caliburn-Micro Silverlight. Mis objetos ViewModel son bastante gruesos ya que llaman a los servicios de WCF y un montón de otras cosas. Por lo tanto, cuando se cierra una ventana, quiero llamar a container.Release (viewModel) para que Castle pueda gestionar todo el proceso de decomiso/eliminación, respetando los diversos ciclos de vida configurados (como se describe en this post).Cómo deshacerse de ViewModels en Caliburn Micro y Castle Windsor

En mi AppBootstrapper He anulado GetInstance de la siguiente manera:

protected override object GetInstance(Type serviceType, string key) 
{ 
    if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType); 
    return container.Resolve(key, serviceType); 
} 

pero estoy luchando para encontrar una manera limpia/elegante de llamar container.Release(viewModel). No parece haber ningún gancho disponible para esto.

¿Cuál es la forma más simple de liberar objetos ViewModel devueltos desde ViewModelLocator en una aplicación Caliburn Micro?

Respuesta

0

El ciclo de vida que desea para cada uno de sus tipos de VM va a tener un impacto aquí, por lo que no hay realmente una respuesta correcta para el contexto que ha proporcionado.

La clase base Screen de CM le proporciona protected virtual void OnDeactivate(bool close);, que es un buen lugar para comenzar. Para sus VM pesadas, debe anular este método, y si la VM está cerrando indicada por el parámetro cerrar, libere los recursos (canales WCF, etc.) que deban eliminarse, esto incluiría eliminar el recurso (si IDisposable es relevante) y también desconectando cualquier referencia al mismo para que pueda ser limpiado por el GC.

No uso Castle, así que no puedo ayudarte en términos de configuración de ciclos de vida, etc. Pero si sigues lo anterior, no te vas a aferrar a nada pesado. Supongo que con la configuración correcta del ciclo de vida, Castle borrará cualquier instancia anterior que no vaya a utilizar de nuevo sin una llamada explícita al Release.

+0

Muchas gracias @Simon. He estado explorando la ruta OnDeactivate como un lugar para conectar. Sí, si tiene una VM con una larga lista de parámetros de constructor, Castle satisfará todas las dependencias del constructor de ese componente. Luego, cuando el componente sea Release() d Castle lanzará todas las dependencias, de acuerdo con los estilos de vida configurados para cada uno de ellos. Lo importante aquí es que los propios Vms no son responsables de ninguno de los trabajos de limpieza, todo es automático. –

+0

Impulsar la responsabilidad hacia abajo de las máquinas virtuales podría funcionar, pero significa que las máquinas virtuales comienzan a contaminarse con las responsabilidades del ciclo de vida que realmente quiero mantener fuera de ellos si es posible. La responsabilidad ideal para Release debería ser la responsabilidad de Resolve, es decir, más arriba en la pila de llamadas, en el bootstrapper o en el propio contenedor ... –

+0

Sí, eso es lo que digo, como ejemplo si configuraste tu VM con una ciclo de vida de "uso único" (lo que siempre se asigna a en Castle) la próxima vez que solicite una instancia de ese tipo, el contenedor debería simplemente liberar la instancia utilizada porque ya se ha utilizado ... no se requiere una llamada explícita para su lanzamiento . –

Cuestiones relacionadas