22

Per l'applicazione web (ASP.NET MVC) Sono attualmente in via di sviluppo, abbiamo la seguente architettura a posto:Che tipo di architettura si chiama?

  • Data Access Layer: Logic per la persistenza dei dati in un db arbitraria
  • Domain: Il modello di dati
  • Service Layer: logica di business (ad esempio l'elaborazione degli ordini, la gestione degli account, ecc)
  • Controller: utilizza servizi e fornisce/riceve i dati da/per la vista
  • View: L'interfaccia utente per l'utente

In sostanza, ho preso il Model e dividerlo nella DAL, Service Layer e Domain. Ho sentito che riempire tutta la logica all'interno dello ha reso il mio codice eccessivamente complicato. Inoltre, sentivo che mi permetteva di esprimere la mia logica di business in modo pulito senza che il controller facesse troppo lavoro.

La mia domanda è: Come si chiama questo tipo di architettura?

Come domanda secondaria: Questo tipo di architettura ha senso? In caso contrario, sto facendo qualcosa di sbagliato?

risposta

23

Sei sulla strada giusta su DDD a seconda di quanto sottili/spessi sono i livelli di servizio del dominio &. DDD dice che la conoscenza (cioè la logica di business) dovrebbe essere scricchiolata nel modello di dominio. Spostare i problemi di accesso ai dati al DAL è in linea con DDD, ma penso che lo spostamento della logica aziendale in un livello di servizi non lo sia. Se si dispone di un livello di "modello di dati" thin Domain (principalmente per le entità) e di un thick layer di servizi (principalmente per "business logic"), è possibile che sia presente un anemic domain.

Inoltre, non vi è tecnicamente alcun "Service Layer" in DDD. Potrebbe esserci un "Application Layer", ma dovrebbe essere sottile e solo essere responsabile per il flusso di applicazioni/gestire le durate della classe del dominio. Questo è essenzialmente ciò che i controllori fanno in .NET MVC, gestiscono il flusso delle applicazioni nel contesto del web http.

Se riempire tutta la logica all'interno del Modello ha reso il tuo codice eccessivamente complicato, sarei interessato ad ascoltare esempi di ciò che intendi per "eccessivamente complicato". Potresti modellare correttamente un dominio complesso o ci sono possibilità che tu abbia potuto passare ai pattern DDD per cose semplici. Direi che come hai elencato nella tua domanda, l'arco non è DDD. Lo chiamerei semplicemente "Architettura stratificata", ma è perché preferisco usare il termine "tier" solo quando si parla di arch. Fisico. Tuttavia, la tua architettura logica è stratificata.

Mi piace molto il fatto che Darin si sia collegato all'arco di cipolla nella sua risposta. Sto diventando un grande fan di questo, e trovo che non sia esclusivo del DDD.Se il tuo codice utilizza l'iniezione di dipendenza per risolvere le dipendenze dell'interfaccia con le implementazioni di runtime, potresti avere una forma di arco di cipolla. Ad esempio, definisci eventuali interfacce nel tuo DAL? Le implementazioni di queste interfacce sono risolte in fase di runtime?

Ecco un esempio di un arco che sto iniziando a utilizzare nei miei nuovi progetti. E 'una combinazione di cipolla + DDD:

  • API Progetto/Struttura: generici interfacce, enumerazioni, classi e metodi di estensione utilizzati da tutti gli altri livelli. Non è necessario essere separati dal dominio, ma possibile.

  • Domain Progetto/Assemblea: tutte le entità e la logica aziendale. Dipende solo da API. Utilizza pattern DDD come factory, service, specifiche, repository, ecc. Contiene anche altre interfacce specifiche del dominio che non sono definite nell'API.

  • Impl Progetto/Assieme: implementazioni di interfacce definite in API e Domain. È qui che viene implementato EF DbContext, come ad esempio la registrazione, l'invio di e-mail, ecc. Tutte queste implementazioni sono iniettate in dipendenza, quindi tecnicamente potresti avere diversi progetti/assiemi Impl.

  • UI Progetto/Assemblea: questo è il progetto MVC. I controller consumano direttamente la superficie del dominio e non passano attraverso un'applicazione o un livello di servizio. Qualsiasi dipendenza di interfaccia in fabbriche, servizi, repository, ecc., Viene iniettata nel dominio dal controller usando MVC IoC (constructor injection).

Ho inserito un livello API proprio al centro ma è possibile combinare i progetti API e Dominio in uno solo. Ad ogni modo, la grande parte carnosa della cipolla è il Dominio, e ha una stratificazione interna. Ad esempio, i Servizi possono dipendere dalle Fabbriche, che dipendono dai Repository, che dipendono dalle Entità.

Il progetto Impl è quello che si vede come la buccia di cipolla "Infrastruttura" nel diagramma di Palermo. Si trova sul bordo esterno insieme all'interfaccia utente e non contiene alcuna conoscenza specifica del dominio. Sa come inviare e-mail, archiviare/recuperare i dati utilizzando EF, ecc. Se vuoi, puoi avere più di 1 di questi - ad esempio 1 Impl per l'accesso ai dati, 1 Impl per gestire la posta, ecc.

MVC ha i controller e le visualizzazioni e si concentra sull'interfaccia utente e sul flusso dell'applicazione web. Tutto ciò che richiede una conoscenza specifica del dominio è delegato al dominio e le classi di dominio sono incorporate nel gestore. Ciò significa che tutte le interfacce basate su un costruttore nelle classi di dominio vengono risolte automaticamente dal contenitore IoC.

Come nota finale, la programmazione rispetto alle interfacce definite nelle classi API e Dominio significa che è possibile testare unitamente il progetto del dominio separatamente dal progetto MVC.

+0

Avete qualche buon esempio di progetti ASP.NET MVC basati su DDD? O quelli che utilizzano l'architettura che descrivi? Ho cercato di leggere il codice di tutti i progetti MVC ASP.NET che posso per capire quali pratiche vengono utilizzate, ma è estremamente difficile. –

+0

Vorrei chiacchierare di questo con voi prima di postare una risposta al tuo commento: http://chat.stackoverflow.com/rooms/9000/danludwig-private-room – danludwig

+0

Risposta così interessante! Non so come Google mi abbia indirizzato a questo vecchio post ma è davvero buono. Potresti scrivere un articolo in Code Project riguardante DDD e Onion Architecture con un esempio :) O lo hai già fatto: D – Celdor

4

Ci potrebbero essere nomi diversi a seconda dell'angolo a cui si sta guardando. Quindi è ancora MVC, è solo che la tua M è divisa in più livelli. Potrebbe anche essere chiamato Multitier architecture (o architettura N-tier). Jeffrey Palermo ha anche usato la nozione di Onion architecture.

4

Poiché il DAL è separato dal modello di dominio e dispone anche del livello di servizio, sembra che si stia dirigendo verso DDD (progettazione basata sul dominio). Ecco una discussione su tale an approach che può essere utile sapere.

+0

+1 Proprio quello che stavo pensando. DDD utilizzato da un'applicazione MVC. Dipende da quanto sono sottili i modelli (o quanto sono spessi i servizi). – jgauffin

20

Da un livello elevato, lo descriverei come un'architettura a più livelli. Descrivendolo come un progetto orientato al dominio guarderebbe anche a modelli più piccoli come aggregato, repository, contesti limitati, ecc. Non posso dire solo dalla tua descrizione.

Se lo strato del dominio risiede in un assieme/pacchetto che non fa riferimento tutti gli altri, allora è il nucleo della Onion Architecture principles, che sono:

  • L'applicazione è costruito intorno ad un oggetto indipendente modello
  • I livelli interni definiscono le interfacce.Strati esterni implementano interfacce
  • Senso di accoppiamento è verso il centro
  • Tutto il codice di base di applicazione può essere compilato e corrono separati dalle infrastrutture

Una cosa concreta da cercare è se i vostri riferimenti DataAccess dominio.

Problemi correlati