Quando modifichi interattivamente qualcosa, mi piace pensare che ci siano due "modelli". C'è il "modello di entità" che è lo stato persistuto e c'è il "modello di modifica" che è lo stato corrente dei dati durante la modifica interattiva.
In genere non sono la stessa cosa. Ad esempio, ci sono stati consentiti nel modello di modifica che non sono consentiti nel modello di entità (come se non avessi compilato un campo obbligatorio).
Quindi il modello di modifica e il modello di entità (per quanto mi riguarda) dovrebbero essere entrambi parte del tuo livello aziendale, perché entrambi contengono regole di business. So che molte persone che utilizzano MVVM pensano che ViewModel debba essere il modello di modifica. Non penso che sia una regola dura e veloce, e nella mia attuale applicazione li sto tenendo separati.
Quindi, Pankaj ha detto:
Controllers process incoming requests, perform operations on the model, and select views to render to the user.
In base a ciò che ho detto sopra, ci sono due tipi di azioni:
- Le normali azioni di modifica (cambiando una selezione in un menu a discesa che ha un effetto su un altro campo) interagiscono solo con il modello di modifica. Il controller crea quindi una nuova vista in base al nuovo stato del modello di modifica.
- Le operazioni "CRUD" che eseguono il commit dei dati devono innanzitutto verificare la validità del modello di modifica (richiamando il modello di modifica stesso) e, se valido, devono quindi eseguire il commit delle modifiche al modello di entità delegando a una sorta di "mappa" metodo nei modelli. In genere ciò impegna le modifiche a un archivio dati condiviso come un database. Gli altri utenti possono quindi vedere le modifiche.
Quindi il controller gestisce tutte le richieste di input, ma delega il lavoro al modello. Dopo aver delegato il lavoro al modello, esegue nuovamente il mapping del modello sulla vista (in genere creando un'istanza di una nuova vista e passando il nuovo stato del modello di modifica).