2013-09-05 11 views
11

Sto applicando DDD per la parte M del mio MVC e dopo alcune ricerche (studiando!), Sono giunto alla conclusione che ho bisogno che il mio controller interagisca con i servizi di dominio (nel modello). Ciò renderebbe il mio controller il consumatore dei servizi di dominio e quindi un servizio applicativo (in termini DDD). È accurato? C'è una differenza tra un controller e ciò che DD definisce come un servizio applicativo?Il controller in MVC considera un servizio di applicazione per DDD?

risposta

7

Il controller non è considerato un servizio in DDD. I controller operano nel livello dell'interfaccia utente. I servizi dell'applicazione ottengono i dati dal DB, convalidano i dati, trasmettono i dati al client (MVC potrebbe essere un client ma potrebbe anche una richiesta proveniente da un'app winforms) ecc.

Tutto ciò che il controller sta facendo è la richiesta di assistenza dal UI. Non fa parte del dominio dell'applicazione.

+0

Il controller richiede le richieste dalla vista passando la richiesta, o parte pertinente, al modello. MVC è un'architettura e potrebbe sicuramente essere applicata a winforms e alle app Web. Mi permetto di dissentire per quanto riguarda la posizione del controller. The View è sicuramente l'unico UI-Layer e il punto di MVC è di mantenere questo UI-Layer separato dal controller. Il tuo punto è ben preso però; Grazie per la risposta. – Louis

+0

-1. I controllori sono coordinatori di richieste/comandi.In un'architettura esagonale i controllori sono proprio sopra i servizi di applicazione/i gestori di comandi/gestori di query. Controller è un traduttore di richieste ed è accoppiato con il protocollo di comunicazione (livello superiore) e il comando/gestori di query (servizi applicativi da un livello inferiore). I controller possono essere visualizzati come facciate di servizi applicativi perché traducono e preparano il comando/query/messaggio per essere elaborati dai livelli di livello inferiore (gestori di applicazioni/gestori di query di comando). – Tudor

+0

-1 perché i controller non hanno nulla a che fare con DDD. È irrilevante dove si mettono i controller, si potrebbe dire che i controller sono solo coordinatori di messaggi/comunicazioni e sono accoppiati in entrambi i modi: ui e servizio applicativo. Potresti avere controller in un contesto limitato in cui non esiste un'interfaccia utente (un puro contesto di comando). E potresti avere un contesto limitato solo per la presentazione (un componente aziendale composito costituito solo per interrogare 2 o più contesti limitati). Post scriptum i controllori hanno un basso accoppiamento con l'interfaccia utente, si aspettano solo una serie di parametri di richiesta, non importa da dove. – Tudor

1

Un'architettura a livelli suddivide l'applicazione in UI-Layer, App-Layer, Livello dominio e Livello infrastruttura (Vaugn Vernons Implementing Domain-Driven Design (posizione 2901)). Il controller si trova in "Application Layer" di questa architettura di progettazione più ampia e pertanto interagirà direttamente con i servizi di dominio nel modello ed è considerato un servizio di applicazione. Non solo, ovviamente utilizzerà anche le entità e gli aggregati disponibili.

+4

Se si guarda a pag. 72 del DDD di Evan vedrai che la figura 4.1 mostra il controller come parte del livello dell'interfaccia utente. E questo ha senso perché se V e C fossero in livelli separati, avresti un accoppiamento intimo tra di loro quando gli strati dovrebbero essere collegati solo attraverso l'indirezione e le interfacce. – Gordon

+1

@Louis, non ho letto il libro di Vaugn Vernons ma sono appena uscito da un progetto DDD di successo. Tutto quello che posso dire è che i controllori erano in un progetto completamente separato, il progetto del cliente. Il cliente nel nostro caso era un front-end MVC. Avrebbe potuto essere qualsiasi altro cliente. Il livello di applicazione era un progetto completamente separato che si ergeva sui suoi due piedi. Aveva i propri validatori e poteva fornire i dati attraverso un'interfaccia WCF. I controller nel client MVC si limitavano a chiamare i metodi proxy del livello applicazione. Oltre a questo, non hanno eseguito altre funzioni. – Greg

+0

@ Gordon V e C possono essere disaccoppiati utilizzando viste passive o controller di supervisione. Per alcune applicazioni, accoppiarle non è necessariamente una cattiva idea. Dipende molto dalle specifiche dell'applicazione in fase di sviluppo. Alla luce del tuo riferimento alla pagina 72 di Evans, ritirerò la mia risposta poiché sembra che ci siano altri approcci che differiscono dai miei. Grazie per la risposta. Vorrei poter entrare in una buona discussione su SO senza il rischio che la domanda venga chiusa come non costruttiva;) – Louis

0

Il livello dell'applicazione è compreso tra il livello dominio e il livello presentazione. Il controller fa parte del livello di presentazione, invia comandi o query al livello dell'applicazione, dove i servizi dell'applicazione li eseguono utilizzando i servizi e gli oggetti del modello di dominio. Quindi i controller sono diversi dai servizi applicativi e probabilmente sono legati al modulo di comunicazione effettivo, ad es. HTTP. Non dovresti chiamare direttamente i servizi di dominio dai controllori, questo potrebbe essere un segno di codice fuori posto.

Domain Driven Design: Domain Service, Application Service

  • Servizi di dominio: Incapsula logica aziendale che non rientra naturalmente all'interno di un oggetto di dominio, e NON sono operazioni tipiche CRUD - chi apparterrebbe a un repository.
  • Servizi applicativi: utilizzati da utenti esterni per comunicare con il sistema (si pensi ai servizi Web). Se i consumatori hanno bisogno di accedere alle operazioni CRUD , saranno esposti qui.

Così il vostro servizio è probabilmente un servizio applicativo e non un servizio di dominio, o alcuni servizi parte app, qualche servizio dominio parte. Dovresti controllare e rifattorizzare il tuo codice. Credo che dopo 4 anni questo non sia importante, ma ho avuto gli stessi pensieri con un'applicazione che sto attualmente sviluppando. Questa app potrebbe essere troppo piccola per utilizzare DDD su di essa, quindi i controller confusi con i servizi delle app sono un segno di overengineering qui.

È una domanda interessante quando iniziare ad aggiungere più livelli. Penso che ogni app dovrebbe iniziare con una specie di domain model and adapters per connettersi a quel modello di dominio. Quindi, se l'app è abbastanza semplice, l'aggiunta di più di 2 livelli potrebbe non essere necessaria. Ma questo è solo un pensiero, non sono così esperto con DDD.

Problemi correlati