2011-08-12 21 views
5

Estoy buscando comenzar a utilizar MVVM Light y encontré la "nueva" interfaz ICleanup. Me preguntaba cuándo limpiarías la máquina virtual ... ¿cuándo saldrías de la página?Cuándo desechar ViewModel en MVVM Light

Además, veo que hay una limpieza principal en el ViewModelLocator que debería limpiar todas las máquinas virtuales ... ¿cuándo se usaría esto?

Muchas gracias

Saludos, Mauro

Respuesta

7

La ventaja de la interfaz ICleanup de la ejecución IDispose (que era antes no) es - como Laurent afirma - que se le puede llamar con más frecuencia y sin marcar la VM como eliminada. Esto significa que debe llamar al ICleanup.Cleanup siempre que quiera/necesite anular el registro del manejo de mensajes para su máquina virtual. Obviamente, en este caso necesita tener un método que registre todos los manejadores de mensajes nuevamente cuando los necesite más adelante.

Personalmente, soy más amigo de la forma IDispose de lidiar con la limpieza de VM, especialmente porque me inclino a los contenedores de IOC. Pero, puedo ver el caso de Laurent e implementar IDisposable llamando al Cleanup en una VM no es ningún engaño.

En general, el momento en el que se desecha/limpia una máquina virtual depende de cómo se crea la instancia y la vida útil del objeto. Estas decisiones se rigen por el diseño de su aplicación y no hay una guía clara para cuando debe hacerlo. Pero tenga en cuenta que tiene por hacer cada vez que registra un manejador de mensajes dentro de su modelo de visualización, en otros casos no es estrictamente necesario.

Y al hablar sobre los manejadores de mensajes, no olvide des-registrarlos en sus vistas también cuando haya registrado un controlador de mensajes allí (vea this post). - Pensando de nuevo, voy a poner el código aquí para que quede claro y para referencia futura:

En el constructor de su vista en el código detrás del archivo agregue el siguiente código para asegurarse de que los manejadores de mensajes registrados se liberen cuando la vista está descargado:

public MyView() { 
    this.Unloaded += (o, e) => { Messenger.Unregister(this); } 
} 
+0

gracias por la respuesta. Ahora entiendo mejor todo el concepto de limpieza después del messenger – Mauro

+0

. Pensé que el messenger usaba WeakReference para que no fuera necesario anular el registro, y que se anularía el registro por otras razones distintas a la limpieza. –

+2

@RalphShillington: Debería hacerlo, pero no es así. Es un problema conocido. Al registrar un controlador, es la función la que hace que se mantenga la referencia, aunque no debería. La razón de esto es que, para funciones anónimas y estáticas, las referencias débiles a las funciones no funcionan. Laurent, algunas otras personas, y yo investigamos esto y el mejor consejo es ... ¡cancelar el registro! – AxelEckenberger

Cuestiones relacionadas