2015-11-28 16 views
7

Mi sono imbattuto in una dichiarazione che il modello di dominio progettato in conformità con DDD non dovrebbe essere utilizzato come risorse in un'API REST (source).Perché il modello di dominio non deve essere utilizzato come risorse nell'API REST?

È chiaro che un'API REST è un contratto dell'applicazione mentre il modello di dominio è parte dell'implementazione e quindi è meglio tenere queste due cose separate, in modo che una modifica nel modello di dominio non avvenga automaticamente implica un cambiamento nell'API REST.

Tuttavia, penso che in caso di piccoli progetti (dove l'API REST ha un solo consumatore - il frontend javascript, sviluppato da un team) i vantaggi di avere modelli separati non giustificano il costo della separazione dei modelli (classi diverse - modello di dominio e rappresentazioni di risorse e codice di mappatura tra i modelli). Ovviamente il livello dominio non può avere alcun riferimento al codice dell'infrastruttura specifica REST (per mantenere la separazione delle preoccupazioni).

Il dominio ei modelli REST devono essere separati?

risposta

8

Quando si utilizza DDD, l'API REST deve sempre essere separata dal modello di dominio.

Il motivo principale di ciò è la semplificazione: non si vuole perdere la complessità del modello di dominio tramite l'API per i client. In caso contrario, i clienti devono conoscere le sfumature e le complessità del dominio, il che probabilmente rende l'API difficile da utilizzare.

E il driver principale per l'utilizzo di DDD è un dominio problematico complesso, quindi questo è sempre un problema.

Tuttavia, credo che in caso di progetti di piccole dimensioni (& hellip;) i vantaggi di avere modelli separati non giustifica il costo di separare i modelli (& hellip;).

Sono d'accordo sul fatto che ci sono progetti in cui un modello di dominio separato e l'API REST sono over-engineering. Tuttavia, questi casi non sono candidati per il DDD, perché non si beneficerà abbastanza del DDD per giustificare il suo costo.

1

Penso che un'altra cosa da considerare sia chi usa la tua API REST. Se stai sviluppando un frontend per un'app, potresti dire che tutto sta ancora accadendo all'interno di 1 contesto limitato. Solo alcune parti vivono in client/javascript. In quel caso penso che abbia senso esporre il tuo modello nella tua api di riposo.

in questo caso l'API REST potrebbe essere solo un mezzo di comunicazione con i servizi di dominio, ad esempio.

3

Perché il modello di dominio non deve essere utilizzato come risorse nell'API REST?

Perché il Web è un mondo completamente diverso rispetto al livello del dominio principale. I metodi nelle tue entità sono particolarmente difficili da tradurre poiché HTTP ha solo una manciata di verbi. Se si desidera esporre la propria applicazione tramite REST, è necessario eseguire il calzoleria dei propri processi di dominio in HTTP e questo di solito significa fare compromessi e progettare risorse diverse dalle entità di dominio.

Naturalmente dovresti trovare i termini da Ubiquitous Language nei messaggi scambiati tra il client HTTP e il server e nel Domain Application Protocol se stai facendo HATEOAS, ma il web necessariamente distorcerà le tue rappresentazioni di dominio.

Il punto di REST non è quello di ricreare un modello ad alta fedeltà del dominio e dei suoi processi, ma di consegnarli in un modo conforme a HTTP, perdendo il meno possibile nella traduzione. Eppure rimane una traduzione.

0

È possibile collegare la logica aziendale alle risorse REST in base al modello di dominio. Ad esempio, ogni volta che qualcuno imposta is_published = 1, puoi avvisare un amministratore, effettuare una convalida aggiuntiva, ecc. Agganciando un evento o un mutatore. A volte le cose possono essere troppo complicate e strane da fare in questo modo, quindi puoi contrassegnare certi attributi come non modificabili, quindi creare azioni personalizzate per modificarli che esponi, se questo ha senso. Penso che se si progetta correttamente, non sono nemmeno necessarie queste "azioni personalizzate". Facebook non ne usa nessuno con l'API Graph non credo. Sto pensando di sviluppare un framework basato sulla semplice esposizione del livello Model, ritengo comunque che sia una buona idea.

Problemi correlati