Sto cercando di progettare un'applicazione con un dominio aziendale complesso e un requisito per supportare un'API REST (non strettamente REST, ma orientata alle risorse). Ho dei problemi a trovare un modo per esporre il modello di dominio in modo orientato alle risorse.
In DDD, i clienti di un modello di dominio devono passare attraverso il livello procedurale "Servizi applicativi" per accedere a qualsiasi funzionalità aziendale, implementata da Entità e Servizi di dominio. Ad esempio, esiste un servizio applicativo con due metodi per aggiornare un'entità utente:
userService.ChangeName(name);
userService.ChangeEmail(email);
L'API di questo servizio applicazioni espone comandi (verbi, procedure), non stato.
Ma se dobbiamo anche fornire un'API RESTful per la stessa applicazione, esiste un modello di risorsa utente, simile al seguente:
{
name:"name",
email:"email@mail.com"
}
L'API orientata alle risorse espone lo stato , non i comandi . Ciò solleva le seguenti preoccupazioni:
ogni operazione di aggiornamento su un'API REST può essere associata a una o più chiamate di procedura del servizio applicazione, a seconda delle proprietà che vengono aggiornate sul modello di risorsa
ogni operazione di aggiornamento sembra atomica al client API REST, ma non è implementata in questo modo. Ogni chiamata al servizio applicazione è progettata come una transazione separata. L'aggiornamento di un campo su un modello di risorsa potrebbe modificare le regole di convalida per altri campi. Pertanto, è necessario convalidare tutti i campi del modello di risorsa per garantire che tutte le potenziali chiamate al servizio applicazione siano valide prima di iniziare a effettuarle. Convalidare una serie di comandi contemporaneamente è molto meno banale che eseguirne uno alla volta. Come possiamo farlo su un client che non sa nemmeno che esistono singoli comandi?
la chiamata di metodi del servizio applicazione in ordine diverso potrebbe avere un effetto diverso, mentre l'API REST fa sembrare che non ci siano differenze (all'interno di una risorsa)
Potrei trovare problemi più simili, ma fondamentalmente sono tutti causati dalla stessa cosa. Dopo ogni chiamata a un servizio applicativo, lo stato del sistema cambia. Regole di ciò che è un cambiamento valido, l'insieme di azioni che un'entità può eseguire il prossimo cambiamento. Un'API orientata alle risorse cerca di far sembrare tutto un'operazione atomica. Ma la complessità di attraversare questo divario deve andare da qualche parte, e sembra enorme.
Inoltre, se l'interfaccia utente è più orientata ai comandi, come spesso accade, allora dovremo mappare tra comandi e risorse sul lato client e poi di nuovo sul lato API.
Domande:
- Tutta questa complessità dovrebbe essere gestita solo da un (spesso) livello di mappatura da REST ad AppService?
- O mi manca qualcosa nella mia comprensione di DDD / REST?
- REST potrebbe semplicemente non essere pratico per esporre la funzionalità dei modelli di dominio su un certo grado (piuttosto basso) di complessità?