È giusto avere dipendenze al mio Viewmodel dal livello di accesso ai dati e dal livello di vista

1

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:

  1. Visualizzazioni (UI)
  2. API controller (responsabile della risposta alle richieste dalla vista)
  3. Modelli (logici)
  4. ViewModels (contenenti informazioni per le viste)
  5. 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:

  1. 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.
  2. Il controller Api acquisisce le informazioni e le analizza su StudentViewModel
  3. Il controller Api chiede al repository di creare un nuovo studente da StudentViewmodel.
  4. 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.

    
posta Timon Post 28.10.2017 - 19:31
fonte

1 risposta

2

Gli oggetti ViewModel e gli oggetti Model non sono la stessa cosa.

Lo scopo di un oggetto Model è di modellare qualcosa nel tuo dominio. Lo scopo di un oggetto ViewModel è di modellare qualcosa nella tua vista.

Vedi la differenza?

Il motivo per cui questo non ti sembra giusto è che il Modello non dovrebbe sapere nulla dei tuoi ViewModels. Il tuo repository dovrebbe conoscere solo Modelli.

Ci sono un paio di modi in cui puoi risolvere questo problema. Un modo è creare un oggetto Model da studentViewModel nel tuo controller, e passarlo al tuo repository. L'altro modo per farlo è aggiungere un livello di servizio che accetti gli oggetti ViewModel e li traduca in oggetti Model per il tuo repository.

    
risposta data 28.10.2017 - 19:41
fonte

Leggi altre domande sui tag