Secondo l'approccio tradizionale o teoria, ViewModel dovrebbe essere parte del livello di interfaccia utente. Almeno il nome dice così.
Ma quando si inizia a implementarlo autonomamente con Entity Framework, MVC, Repository ecc., Si realizza qualcos'altro.
Qualcuno deve mappare i modelli di entità con ViewModels (DTO menzionato alla fine). Dovrebbe essere fatto in A) il livello dell'interfaccia utente (dal controller), o in B) il livello di servizio?
Vado con l'opzione B. L'opzione A è un no-no a causa del semplice fatto che diversi modelli di entità si combinano insieme per formare un ViewModel.Non possiamo passare i dati non necessari al livello dell'interfaccia utente, mentre nell'opzione B, il servizio può giocare con i dati e passare solo il necessario/minimo al livello dell'interfaccia utente dopo la mappatura (al ViewModel).
Ma, supponiamo di andare con l'opzione A, mettiamo ViewModel nel livello dell'interfaccia utente (e modello di entità nel livello di servizio).
Se il livello Servizio deve essere associato a ViewModel, il livello Servizio deve accedere a ViewModel nel livello dell'interfaccia utente. Quale biblioteca/progetto? Viewmodel dovrebbe essere in un progetto separato nel livello dell'interfaccia utente e questo progetto deve essere referenziato dal livello di servizio. Se ViewModel non si trova in un progetto separato, allora c'è un riferimento circolare, quindi non andare. Sembra imbarazzante che il livello di servizio acceda al livello dell'interfaccia utente, ma siamo comunque in grado di gestirlo.
Ma cosa succede se c'è un'altra app per l'interfaccia utente che utilizza questo servizio? Cosa succede se c'è un'app mobile? Quanto può essere diverso il ViewModel? Il servizio deve accedere allo stesso progetto di modello di vista? o tutti i progetti UI saranno in competizione?
Dopo queste considerazioni la mia risposta sarebbe quella di mettere il progetto Viewmodel in Service Layer. Comunque, ogni livello dell'interfaccia utente deve accedere al livello di servizio! E potrebbero esserci molti ViewModels simili che tutti potrebbero usare (quindi la mappatura diventa più facile per il livello di servizio). I mapping sono fatti attraverso linq in questi giorni, che è un altro vantaggio.
Infine c'è questa discussione sul DTO. E anche sull'annotazione dei dati in ViewModels. ViewModels con annotazioni di dati non possono risiedere nel livello di servizio. Quindi DTO sarà una copia esatta di ViewModel con una mappatura uno a uno tra i due (diciamo con AutoMapper). Ancora una volta DTO ha ancora la logica necessaria per l'interfaccia utente (o più applicazioni) e risiede in Service Layer. E lo strato UI di ViewModel è solo per copiare i dati dal DTO, con qualche "comportamento" (ad esempio: attributo) aggiunto ad esso.
Anche se non direttamente correlato alla domanda. 'ViewModel Façade' (viewmodel all'interno di un'altra viewmodel) & 'command' menzionato in questo deve guardare channel 9 link vale la pena esplorare (@ 11: 48 inizia)
Questo è praticamente quello che sto facendo ora, ma devo fare qualcosa in modo errato, in quanto mi sembra di avere molte logiche condizionate quando mi occupo del modello di vista sul dominio. Forse ho bisogno di rompere la mia vista in pezzi più piccoli. –
Attualmente ho una vista di modifica che addapts in base allo stato dell'entità. Farei meglio a creare più viste per i diversi stati? –
Senza vedere la tua vista di modifica e modelli, è difficile rispondere. – queen3