Contesto
Nella mia applicazione uso il pattern MVVM. Avrò un ViewModel che può contenere informazioni di uno studente. Questo viewmodel è usato per comunicare tra la mia vista e il mio modello. Io uso ASP.net core MVC con vue.js.
Il mio progetto contiene i seguenti elementi:
- Visualizzazioni (UI)
- API controller (responsabile della risposta alle richieste dalla vista)
- Modelli (logici)
- ViewModels (contenenti informazioni per le viste)
- Repository (modello di repository per la comunicazione con il database)
Senario
Quando l'utente finale crea ad esempio uno studente, compila alcuni dati e premi il pulsante per proteggere lo studente. Ora le informazioni saranno inviate al server con una chiamata Ajax. L'API Controller ora cattura la richiesta HTTP e la trasmette al modello di visualizzazione.
API controller
[HttpPut]
public JsonResult Put([FromBody] StudentViewModel studentViewModel)
{
//...
}
Questa è la procedura nei passaggi:
- La vista fa una richiesta Ajax al Controller Api. Questa richiesta ha tutte le proprietà di StudentViewModel in modo che possa essere analizzata in Controller Api.
- Il controller Api acquisisce le informazioni e le analizza su StudentViewModel
- Il controller Api chiede al repository di creare un nuovo studente da StudentViewmodel.
- Il repository creerà un nuovo studente dalle informazioni in StudentViewModel
Ho il mio livello di accesso ai dati avvolto nel modello di repository. Sembrerà qualcosa del genere:
API controller
[HttpPut]
public JsonResult Put([FromBody] StudentViewModel studentViewModel)
{
using (var db = new UserQuery(DatabaseContext.GetInstance()))
{
// creates a user based on the information in the viewmodel
db.Students.CreateNew(studentViewModel);
}
}
Ma per qualche motivo non mi piace questo approccio. Perché ora ho il mio livello di visualizzazione e il livello dati dipendono dallo stesso modello di vista. La vista è strongmente legata a
lo StudentViewModel perché i dati forniti devono essere convertibili e questo stesso VieModel viene utilizzato per il database per creare un nuovo utente.
Domanda
C'è un modo migliore per questo scenario? Oppure va bene.