2009-08-17 11 views
5

Ho sviluppato un codice WPF basato su MVVM e ho bisogno di qualche piccolo refactoring ma prima di farlo ho bisogno di decidere la migliore architettura.Dati MVVM e dati semi-globali

Inizialmente avevo iniziato con un'applicazione che poteva presentare diverse rappresentazioni simili (ma separate) dei miei dati. Chiamiamolo RecordsViewModel che aveva un corrispondente RecordsView. Col passare del tempo, ho introdotto un SettingsViewModel che è stato passato nel costruttore del RecordsViewModel e pubblicato visibilmente (permettendo a RecordsView di usarlo). Lo SettingsViewModel è registrato in modo che le modifiche si riflettano in tutte le mie viste.

Ora voglio dividere lo RecordsView un po 'perché ora contiene due viste distinte.

Il problema che ho è:

  • il nuovo (e RecordsMainViewRecordsAlternativeView) entrambi vogliono vedere Impostazioni.
  • a differenza del precedente RecordsView che viene istanziato a livello di codice, queste nuove viste sono istanziate da Xaml (costruttore predefinito).

Quindi le mie opzioni sembrano essere:

  1. Walk the Albero modello verso l'alto per trovare un genitore con un Impostazioni
  2. eseguire le impostazioni di un DependencyProperty sui controlli e rendere il Xaml unirsi alla proprietà al esempio.
  3. Marca SettingsViewModel a Singleton.

Altre opzioni, migliori? Quale considereresti meglio?

risposta

3

Vorrei trasformare la logica delle impostazioni in un servizio (ISettingsService) e utilizzare il localizzatore di servizi o l'iniezione delle dipendenze per ottenere da quel servizio qualsiasi modello di visualizzazione ne ha bisogno.

I servizi sono ottimi per la gestione dello stato condiviso e il servizio di ricerca/identificazione rende molto semplice per le macchine virtuali ottenere un riferimento al servizio. Memorizzare lo stato condiviso in una VM è un po 'hacky e, come hai scoperto, non è davvero scalabile. Una buona regola empirica potrebbe essere chiedersi se lo stato nella VM esiste solo per supportare la vista corrispondente o se altri componenti avranno bisogno di accedere a tale stato. Se quest'ultimo, lo sposta in un servizio.