Domain Driven Design for RESTful Systems - Jim Webber
cosa se voglio fornire un modo per aggiornare tutto il biglietto atomico?
Se si desidera aggiornare l'intero ticket atomicamente, aggregare fossi; gli aggregati sono lo strumento sbagliato nella tua casella se quello che vuoi veramente è un negozio di valore chiave con semantica CRUD.
Gli aggregati hanno senso solo se sono regole aziendali che il dominio deve applicare. Non costruire un trattore quando tutto ciò di cui hai bisogno è una pala.
A titolo di esempio, l'utente può fare una richiesta PUT a/API/biglietti/5
che sta andando a fare un pasticcio. In un'implementazione CRUD, sostituire lo stato corrente di una risorsa inviandogli una rappresentazione di un nuovo stato è appropriato. Ma questo non è assolutamente adatto per gli aggregati, perché lo stato dell'aggregato non è sotto il controllo dell'utente, del cliente/editore.
L'idioma più appropriato è quello di pubblicare un messaggio su un bus, che quando gestito dal dominio avrà l'effetto collaterale di ottenere le modifiche desiderate.
PUT /api/tickets/5/messages/{messageId}
ORA il tuo servizio di applicazione guarda il messaggio e invia i comandi al aggregata
if(DTO.Status != null && dto.Status == "RESOLVED")
supportTicket.Resolve();
if(DTO.Title != null)
supportTicket.setNewTitle(DTO.title);
Questo è OK, ma in pratica la sua molto più comune per rendere il messaggio esplicito su ciò che è di essere fatto.
{ "messageType" : "ResolveWithNewTitle"
, "status" : "RESOLVED"
, "Title":"Some crazy title"
}
o addirittura ...
[
{ "messageType" : "ChangeTitle"
, "Title" : "Some crazy title"
}
, { "messageType" : "ResolveTicket"
}
]
In sostanza, si vuole dare l'applicazione abbastanza contesto che può fare la convalida messaggio vero e proprio.
diciamo che ho avuto aggregati che incapsulate logica di business necessaria, ma oltre a questo c'è una nuova domanda di funzionalità di aggiornamento atomica e sto cercando di capire un modo migliore per affrontare questo.
Quindi il modo giusto per affrontare questo è il primo ad affrontare il problema a livello di dominio - sedersi con i vostri esperti del settore, assicurarsi che tutti capiscono l'esigenza e come esprimere nel linguaggio onnipresente, ecc.
Implementare tutti i nuovi metodi necessari nella radice aggregata.
Una volta che il caso di utilizzo è correttamente supportato nel dominio, è possibile iniziare a preoccuparsi delle risorse seguendo il modello precedente: la risorsa accetta solo la richiesta in arrivo e richiama i comandi appropriati.
Penso che questo sia più design API rispetto a DDD, ma controlla questo articolo: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling - tl; dr; sfuggire al CRUD. – acid