In un sistema MVC, dove dovrebbe stare il codice di persistenza del database?

21

Ho visto più configurazioni per informazioni persistenti nel database. In generale, tre tipi di design sembrano comuni nella mia parte del mondo:

  • Il controller gestisce la persistenza
  • Il modello gestisce la persistenza
  • La libreria di terze parti gestisce la persistenza, di solito richiede una sorta di annotazione sul modello.

Mi chiedo quale configurazione (se esiste) sia concettualmente la più facile da usare / compatibile con un'architettura MVC?

(Se non è uno che ho elencato, per favore fornisci una breve descrizione / panoramica come parte della risposta)

    
posta blueberryfields 13.02.2012 - 17:13
fonte

5 risposte

13

La tua seconda e terza opzione sono identiche. L'M in MVC non è il modello di dati, ma piuttosto il modello di dominio. Ciò include la persistenza, fatta direttamente o tramite un ORM, ed entrambi sono perfettamente corretti.

Il controllore dovrebbe gestire il flusso del sito e trasferire materiale al dominio (a volte tramite un livello di servizio) per essere gestito, quindi persistere da lì è sbagliato - o almeno semanticamente scomodo.

    
risposta data 13.02.2012 - 17:25
fonte
5

Realisticamente, MVC è principalmente un modello di implementazione dell'interfaccia utente, quindi la domanda è in qualche modo discutibile. Tuttavia, ci sono davvero solo due opzioni di grandi dimensioni. Generalmente il tuo controllore invia richieste per caricare o salvare entità nel tuo modello usando 1) un livello di servizio di qualche tipo o 2) il modello di Record attivo.

Il livello di servizio può assumere un numero qualsiasi di moduli, sebbene la mia preferenza personale sia di lavorare con un'astrazione di repository per le entità radice aggregate, le cui implementazioni concrete funzioneranno con ORM o con un DAO leggero o un'API per qualche archivio non relazionale se questo ha senso per l'applicazione.

Il pattern Active Record significa che il tuo modello ha la responsabilità della persistenza, anche se di solito significa che una classe base di qualche tipo gestisce i mapping al tuo negozio, quindi il tuo modello non è realmente direttamente coinvolto.

Fondamentalmente, il controllore invia richieste agli oggetti persistenti, sia che si tratti di una chiamata al repository, dell'implementazione di UnitOfWork o del metodo di salvataggio sulle entità. Se stai usando repository, i tuoi oggetti modello sono ignoranti alla persistenza.

    
risposta data 13.02.2012 - 17:42
fonte
3

In un sistema MVC (model-view-controller), il modello contiene i dati. Quindi, credo, dovrebbe esserci la persistenza del database.

    
risposta data 13.02.2012 - 17:21
fonte
2

La maggior parte dei campioni MVC di alto livello che ho visto hanno un layer infrastructure separato con il codice di implementazione del database effettivo (ad esempio le chiamate specifiche a NHibernate o EF o Linq o qualsiasi altro dato layer is), mentre il livello "model" (spesso anche il livello "Domain") ha le interfacce che definiscono i servizi dati.

    
risposta data 13.02.2012 - 19:32
fonte
0

La pratica standard in MVC consiste nell'includere la struttura e la persistenza dei dati nel livello M (odel).

Il livello del modello non include solo le classi (POCO ecc.) che userete nella vostra applicazione. Includono i repository per tali classi.

Un esempio potrebbe essere un repository in cui sono presenti mazzi di istanze di classi di dati, ad esempio:

Clients repository

AllClients()
RecentClients()
ClientByID(int id)

Sarai in grado di organizzare meglio il tuo dominio dei modelli e di accedere ai tuoi dati in molti modi, ma il livello dati / modello sarà compatto e robusto

    
risposta data 13.02.2012 - 20:49
fonte

Leggi altre domande sui tag