2012-12-13 31 views
6

Ho un'applicazione WPF che sembra qualcosa di simile:WPF, MVVM, ICommand e repository

enter image description here

ViewModel avvolge il modello ed espone gli attributi relativi alla visualizzazione tramite INotifyChanged. La vista è inoltre associata a diversi oggetti ICommand che gestiscono determinati comportamenti attivati ​​dalla vista. Ho un ICommand esterno il cui unico scopo è quello di salvare il modello in un database.

Tutto ciò che ho letto indica che né la vista né il viewmodel dovrebbero avere un riferimento al repository. Questo è il motivo per il comando 3 che è al di fuori del viewmodel.

La mia domanda è duplice. Innanzitutto, si tratta di un'architettura ragionevole e, in secondo luogo, quale è un buon modo per ottenere l'istanza del modello su comando 3 in modo che possa essere inserita nel repository?

+0

Come esattamente 'Command 1' e' Command 2' IN VM e 'Command 3' è OUT della VM? Non tutti i comandi sono implementati separatamente nelle proprie classi e solo "aggiunti" alla VM come proprietà? In questo contesto, come è un comando nella VM e un altro nella VM? –

risposta

8

Personalmente, non vedo alcun problema se il ViewModel ha un riferimento al repository. Cercare di evitare ciò causerà complicazioni inutili.

In MVVM, ViewModel è in genere il livello "colla" che si trova sopra il modello e il repository è parte del modello (fa parte della logica/dati specifici del dominio). La mia blog series on MVVM shows a good image di come io personalmente penso a questo:

MVVM Diagram

Lasciando il lavoro VM con il repository direttamente mettendo Comando 3 nella VM sarebbe probabilmente più pulito che cercare di separare fuori.

+0

Vorrei solo aggiungere un po 'a quello che ha detto Reed: Potresti certamente disaccoppiarlo un po' estraendo i dettagli del tuo repository se lo volessi. Ma sono d'accordo, nessun motivo per separarli completamente come mostra il diagramma. – Tim

+0

@Tim Buon punto. Estrarre i dettagli del repository è molto utile, ma quasi un problema separato (ottimo per testabilità, ecc.). –

+0

Concordo sul fatto che si tratti di una questione separata, ma mi chiedo in qualche modo se quella sorta di astrazione possa essere stata la ragione per cui l'OP ha sentito che dovrebbe disaccoppiarli. Volevo solo risponderti "bene, allora perché [chiunque] ha detto che avrei dovuto farlo se non ne avessi bisogno?" domanda prima di chiederlo! – Tim

0

Il modello di vista deve comunicare direttamente al livello aziendale (oggetti dominio + servizi di dominio) e non al repository. Inoltre, questa comunicazione dovrebbe essere fatta tramite i comandi.

In modo da avere:

Visualizza -> Visualizza Modello -> Comando -> Oggetto Domain/Servizio Domain -> Repository

A meno che non si sta sviluppando una davvero semplice applicazione CRUD ...