Continuo a lottare con il modello MVVM e, nel tentativo di creare un progetto pratico per un progetto di piccole/medie dimensioni, ho incontrato una serie di sfide. Una di queste sfide è capire come ottenere i vantaggi del disaccoppiamento con questo modello senza creare un sacco di codice ripetitivo e difficile da gestire.MVVM: Thin ViewModels e Rich Models
La mia strategia attuale è stata quella di creare classi modello "ricche". Sono pienamente consapevoli del fatto che saranno consumati da un pattern MVVM e implementeranno INotifyPropertyChanged, permetteranno che le loro collezioni vengano osservate e rimarranno consapevoli del fatto che potrebbero essere sempre sotto osservazione. Le mie classi ViewModel tendono ad essere sottili, esponendo solo le proprietà quando i dati devono essere trasformati, mentre la maggior parte del loro codice è RelayCommand handler. Le visualizzazioni si associano felicemente a ViewModels o Models direttamente, a seconda che sia necessaria una trasformazione dei dati. Uso AOP (tramite Postsharp) per alleviare il dolore di INotifyPropertyChanged, rendendo semplice rendere tutte le mie classi Model 'ricche' in questo modo.
Ci sono degli svantaggi significativi nell'utilizzo di questo approccio? Posso presupporre che ViewModel e View siano così strettamente accoppiati che se ho bisogno di una nuova trasformazione dei dati per la vista, posso semplicemente aggiungerlo al ViewModel secondo necessità?
Le 'forze esterne' sono una buona descrizione di come funziona attualmente il mio disegno. La mia VM sta trasformando il Modello (se necessario) per la Vista, ma il Modello può essere interpretato dalla VM, da altri Modelli o da una VM completamente diversa che interagisce con essa in un modo diverso. Se un'estensione dello strumento aggiunge un cavo nel mio modello, mi piacerebbe che tutte le mie macchine virtuali e le mie viste guardassero il cablaggio per vedere la modifica. Ho creato raccolte personalizzate che monitorano il modello ObservableCollections per fornire filtri speciali (oltre al solo filtro CollectionView), ma il più delle volte mi collego al modello ObservableCollection. –