2009-08-17 10 views
5

He desarrollado algún código WPF basado en MVVM y necesito alguna refactorización menor pero antes de hacerlo necesito decidir la mejor arquitectura.Patrón MVVM y datos semi-globales

Originalmente comencé con una aplicación que podría presentar varias representaciones similares (pero separadas) de mis datos. Llamémoslo RecordsViewModel que tenía un RecordsView correspondiente. Con el paso del tiempo, introduje un SettingsViewModel que se pasó al constructor del RecordsViewModel y se publicó visiblemente (lo que permite que RecordsView lo use). El SettingsViewModel está registrado para que los cambios se reflejen en todas mis vistas.

Ahora quiero dividir RecordsView un poco porque ahora contiene dos vistas distintas.

El problema que tengo es:

  • la nueva (RecordsMainView y RecordsAlternativeView) ambos quieren ver Configuración.
  • a diferencia del anterior RecordsView que está instanciado por programa, estas nuevas vistas se crean instancias de Xaml (constructor predeterminado).

Así que mis opciones parecen ser:

  1. Camina el modelo de árbol hacia arriba para encontrar un padre con una configuración
  2. establecer la configuración de un DependencyProperty en los controles y hacer que el Xaml unirse a la propiedad de la ejemplo.
  3. Marca SettingsViewModel a Singleton.

¿Alguna otra opción mejor? ¿Cuál considerarías mejor?

Respuesta

3

Convertiría su lógica de configuración en un servicio (ISettingsService) y usaría el localizador de servicios o la inyección de dependencia para acceder a ese servicio desde cualquier vista que los modelos lo necesiten.

Los servicios son geniales para gestionar el estado compartido, y el localizador de servicios/DI hace que sea muy fácil para sus máquinas virtuales obtener una referencia del servicio. Almacenar el estado compartido en una VM es un poco raro y, como has descubierto, realmente no se escala. Una buena regla empírica podría ser preguntarse si el estado de la VM existe solo para admitir la vista correspondiente o si otros componentes necesitarán acceder a ese estado. Si esto último, muévelo a un servicio.