Pattern di repository con livello di servizio: troppa separazione?

7

Ho un sito MVC che utilizza il modello di repository. Non mi sembra di usare abbastanza lo stile MVC, quindi mi sto preparando a ri-progettarne alcuni. Ma voglio anche farlo, quindi se il front-end dovesse cambiare, sarà più facile sostituirlo.

Ecco cosa ho attualmente

Modelli: alcuni dei miei modelli contengono direttamente le mie entità / classi. (Il modello di accesso contiene la classe Customer, che è una correlazione diretta con la classe Tabella / repository Cliente) Visualizzazioni: alcune delle mie visualizzazioni contengono le domande repo, ovvero

_customerRepo.Query().FirstOrDefault(c => c.Login == User.Identity.Name);

Controller - Non è un grosso problema qui, i controller chiamano alcune richieste di repo, e alcuni di loro usano anche alcuni servizi per chiamare i repository - cioè

_customerService.GetAllCustomers()

che chiama

_customerRepo.Query().All();

Ecco i miei pensieri:

1) I modelli devono contenere SOLO i dati necessari per essere presentati sulla vista. Anche se tutte le proprietà della tabella / dell'oggetto Cliente sono presentate sulla vista, dovrebbero essere riscritte sul proprio modello / classe in modo che la vista non sappia nulla sull'architettura del database o sugli oggetti di backend

2) Le viste dovrebbero accedere solo agli oggetti del modello

3) (Ed è qui che sto lottando su quale percorso prendere)

a) I controller (o da qualche parte sul lato MVC, dovrebbero essere codice che converte i dati dell'oggetto restituiti dal repository / servizi e li converte nei modelli. Suppongo che potrei semplicemente inserire questo codice in un costruttore di modelli. Ma ho notato che DI si aspetta un costruttore vuoto predefinito nel caso ci siano errori di validazione

b) I controller chiamano le interfacce di repository su metodi ben denominati per recuperare i dati (ad esempio _customerRepo.GetAllCustomers ()

c) I controller accedono SOLO a un livello di servizio. Il livello di servizio è quindi l'unica cosa che interagisce con il livello repo.

Sto cercando di estrapolare troppo il modello, il controller, il servizio, i livelli del repository? Il livello dei servizi è troppo oneroso poiché può essere fatto dai repository?

Qual è l'approccio consigliato per convertire gli oggetti / entità aziendali nei modelli?

    
posta ganders 25.08.2015 - 21:11
fonte

3 risposte

7

Sì, il livello di servizio è un sovraccarico se non si dispone di alcuna logica di business. L'architettura a strati assomiglia a un sovraccarico quando un livello (nel tuo caso di assistenza) non sta facendo molto. Ma un'architettura a strati fornisce il tuo accoppiamento libero che è generalmente utile per adattare i requisiti in futuro.

Se puoi garantire che non dovrai mai fare nulla nel livello di servizio, ad eccezione della copia dei dati da repo al modello, puoi rimuovere il livello di servizio nel tuo progetto. Tuttavia, se la tua applicazione è di base, non devi preoccuparti di aggiungere un altro livello per le prestazioni o altro motivo.

Personalmente manterrò il livello di servizio e (dipende dalla tecnologia) implementerò un livello DAO / Repository generico.

    
risposta data 28.08.2015 - 12:15
fonte
2

Dipende dai tuoi repository concreti, ma in generale, aggiungerei un livello di servizio in cima ai repository.

A seconda dell'implementazione del repository, potrebbero essere specifici per il tuo archivio di persistenza. Semplifica anche i test e porta a un'architettura esagonale, invece di un'architettura a più livelli (che considero un vantaggio), vedi link .

    
risposta data 28.08.2015 - 15:51
fonte
-3

Per chiarire un po 'cosa è un controller: MVC risale a quando avevamo mainframe e app per la visualizzazione di testo. Il modello era i dati sul mainframe, la vista era lo schermo del terminale e il controller era la tastiera (premi # per manipolare il modello).

Le cose sono cambiate perché al giorno d'oggi utilizziamo il mouse e i pulsanti (per controllare l'applicazione) sono visualizzati nella vista.

    
risposta data 21.04.2017 - 16:01
fonte