9

Nella mia app ASP.NET MVC, ho una pagina di modifica abbastanza complessa che combina un numero di modelli in un'unica vista.ASP.NET MVC - Devo utilizzare il modello di repository per scrivere ViewModels nel database o convertirli prima in Modelli?

Sto utilizzando il modello ViewModel per combinare tutte queste informazioni e presentare un oggetto coesivo alla vista.

Ad esempio, la struttura ViewModel è qualcosa di simile:

CompanyId 
CompanyName 
List<Employee> Employees 
List<ContactMethod> ContactMethods 

L'oggetto Employee ha una serie di proprietà di base, e un metodo di contatto preferito.

Nella pagina di modifica, l'utente riceve tutti i dipendenti dell'azienda e ha la possibilità di aggiungere e rimuovere (utilizzando javascript), nonché modificare i dettagli dei dipendenti. L'elenco ContactMethods viene utilizzato per popolare il menu a discesa per ciascun dipendente.

Ho tradotto con successo i miei modelli (letti dal database) in questo ViewModel e di nuovo indietro, quindi dopo una modifica, sono rimasto con un ViewModel che rappresenta lo stato corrente dei dipendenti di quella società.

sto usando un modello Repository per comunicare con il database, quindi la mia domanda è, Devo chiamare direttamente nel CompanyRepository, passando il ViewModel, o dovrei convertire il ViewModel indietro nel modello oggetti prima di utilizzare il repository per scriverli nel database?

In breve, il repository deve conoscere i miei oggetti ViewModel?

risposta

13

Vorrei convertire il ViewModel in oggetti Modello prima. Mi piace mantenere la dipendenza tra il mio livello Web e i livelli del repository più liberi possibile.

Non penso che il tuo repository debba conoscere il tuo ViewModel, dal momento che questo è un concetto di livello web.

+0

Se questo è il caso (e questo va bene), avrei bisogno di creare questi modelli di dipendenti, eliminare tutti i dipendenti esistenti da quella società, quindi aggiungere i nuovi modelli di dipendente ... o ... recuperare tutti i modelli di dipendente dal database e confrontarli prima di aggiungere, rimuovere e modificare, se necessario. Suona bene? – Damovisa

+0

@Damovisa: potresti farlo. Invece, manterrei queste informazioni durante la modifica. Nel tuo ViewModel mantieni tre liste: CreatedEmployees, EditedEmployees, DeletedEmployees. – manu08

+0

@ manu80 - Capisco come potrebbe funzionare, ma potrebbe essere un po 'complicato. L'interfaccia utente dovrebbe cambiare un po 'per tenere conto di queste tre raccolte, anche se è solo il javascript che cambia. – Damovisa

4

ViewModel è il modello della vista (UI), quindi il repository non dovrebbe conoscere il modello di visualizzazione. Separandoli manterrai il repository liberamente accoppiato dall'interfaccia utente.

Utilizzare un altro livello come livello di servizio per incapsulare l'archivio dall'interfaccia utente. Questo livello fa anche la conversazione ViewModel - Modello e fa la chiamata al respository.

public class ServiceLayer 
{ 
    public void SaveModel(ViewModel viewmodel) 
    { 
     var model = viewModel.ToModel(); 
     repository.Save(model) 
    } 
} 
+0

Perché rendere il ServiceLayer dipendente da ViewModel? Chiama invece viewModel.ToModel nel livello di visualizzazione, quindi passa il modello al servizio. – manu08

+0

@Hery - Sì, suona bene, ma ci sarebbe molto di più che passare un modello al repository. I modelli dei dipendenti possono essere nuovi, modificati o rimossi. – Damovisa

+0

@manu: è solo un modo diverso di implementare, dipende da come si desidera incapsulare il repository dalla vista. Ma posso elencare alcuni dei vantaggi come: - Eseguire alcune convalide di business che non sono coperte dalla conversione di ToModel. - Mantenere il modello di repository semplice e generico, mentre il livello di servizio esegue attività più specifiche legate al modello di vista solo i miei 2 centesimi :) – heisthedon

1

Sono d'accordo con la risposta precedente di convertire ViewModels di nuovo in Modelli "semplici", ma aggiungo che questo compito dovrebbe probabilmente essere effettuata da uno strato di servizio separato. Questo strato sarebbe responsabile dello smontaggio dei ViewModel e del corretto funzionamento.

Questa è essenzialmente la definizione di un servizio: qualcosa il cui compito è realizzare un'unità logica di lavoro che richiede più modelli e/o logica complessa.

+0

Penso che questo adattamento debba essere separato dai controller, ma non lo penso si inserisce in uno strato completamente separato. È solo un concetto di livello di vista e dovrebbe cadere in tutti gli strati inferiori. Puoi semplicemente creare adattatori o qualche tipo di classe helper nello stesso livello dei controller/viste. Vorrei salvare quel livello di servizio (che è tra il repository e il livello vista) per validare i modelli. – manu08

Problemi correlati