Chi comunica con il database in MVC / MVP?

5

Sto costruendo una piccola applicazione e voglio salvare i miei oggetti di business in un database.

Ho i miei oggetti business e un modello che funge da contenitore per i miei oggetti aziendali e fornisce metodi per la loro creazione e cancellazione. L'aggiornamento degli oggetti di business avviene modificando direttamente gli attributi degli oggetti. Ho anche un'interfaccia utente e un relatore per l'interazione con l'utente e un comunicatore di database che sa come inserire / eliminare / aggiornare i miei oggetti di business nel database.

Voglio aggiornare costantemente il mio database se un oggetto business è creato , cancellato o alterato .

Il modo più semplice sarebbe dare al mio modello un riferimento al comunicatore del database e chiamare i metodi insert / delete, quando un oggetto business viene creato / eliminato nel modello e chiama il metodo di aggiornamento dal mio relatore, quando l'utente altera gli attributi degli oggetti di business tramite l'interfaccia utente.

Si tratta di un modo accettabile di gestire un database in uno scenario MVP / MVC o esiste solitamente un accoppiamento più stretto tra il database e il livello del modello? Se è così, c'è una buona pratica per far sapere al mio modello che uno degli oggetti aziendali è cambiato, o semplicemente uso quello che mi offre la lingua che sto usando?

    
posta Luca Fülbier 23.02.2016 - 01:40
fonte

1 risposta

9

L'ho visto fare in due modi.

Il primo modo è fare tutto usando i metodi CRUD. Questo è essenzialmente il modo in cui descrivi: Crea, Leggi, Aggiorna ed Elimina. La maggior parte dei Object-Relational Mapper (ORM) supporta queste quattro operazioni.

Il secondo modo per farlo è fornire un livello di servizio. Il livello di servizio espone i metodi che comprendono le operazioni aziendali. A sua volta, traduce tali operazioni aziendali nei metodi CRUD appropriati.

A questo punto, potrebbe essere utile discutere un po 'di architettura.

Innanzitutto, nota che MVC e MVP sono principalmente relativi all'interfaccia utente. Cioè, a loro non interessa particolarmente ciò che accade nel dominio aziendale. Mentre l'interfaccia utente può, e spesso fa, riflettere la natura del dominio aziendale nei dati che mostra e le interazioni che esso produce con l'utente, il sollevamento pesante viene eseguito nella porzione di M odel di MVC o MVP.

In una pagina web, MVC si presenta in genere in questo modo:

Model <--> Controller <--> View

Il Modello è la parte "di tutto il resto" di questi schemi, la parte che non si occupa di UI o di routing o di quei meccanismi. Potresti aver sentito la frase "controller sottile, modello grasso". Ciò significa che la logica aziendale non entra nel controller. A sua volta, la vista non si occupa di dati, per la maggior parte. È solo una superficie; il compito di riempirlo con i dati in genere ricade su un oggetto ViewModel, che viene solitamente assemblato nel controller con i dati derivati dal modello.

Model <--> Controller <--> ViewModel <--> View

La vista mostra i dati e accetta i dati digitati dall'utente. Potrebbe avere alcune funzionalità interattive e di convalida, ma anche la convalida non è interamente eseguita nel client (perché non è possibile fidarsi dei dati di un client). La validazione è relegata al server, in cui il Controller (che agisce principalmente come un centralino) in genere delega tale convalida al Modello.

In altre parole, la maggior parte della logica applicativa che effettivamente fa qualcosa di utile viene spinto fin che può essere verso il Modello.

È per tutti questi motivi che le applicazioni MV * di solito hanno un qualche tipo di Service Layer, anche se è solo interno.

Database <--> ORM <--> Service Layer <--> Controller <--> View Model <--> View
|-------------- Model -------------|

Il Service Layer allevia il Controller dal dover pensare a Business Logic e consente al Database Communicator (ovvero al tuo ORM) di pensare solo a CRUD.

Ulteriori letture
P di EAA: Service Layer
Fowler su UI Architectures

    
risposta data 23.02.2016 - 02:13
fonte

Leggi altre domande sui tag