Esposizione di modelli di dominio su API

8

Sto costruendo una semplice API RESTful per un'applicazione basata su Web su cui sto lavorando e mi sto chiedendo quale sia il modo migliore per esporre i miei modelli di dominio.

Diciamo che ho una classe User e voglio fornire una risposta JSON con le varie proprietà dell'utente. Ovviamente non voglio esporre pubblicamente ogni proprietà del mio modello (cose come DateCreated, PasswordHash ecc.) A causa di problemi di sicurezza e larghezza di banda.

Ho letto in Data Transfer Objects e mi chiedo se questa è la strada da percorrere. Se ho ragione, potrei passare, ad esempio, un modello utente al mio DTO utente e garantire che detto DTO consenta solo l'esposizione delle proprietà dell'utente che scelgo (il che aiuterebbe anche a disaccoppiare i miei modelli dalla mia API pubblica).

Questa soluzione è appropriata o ci sono modi migliori per farlo?

Grazie.

    
posta James 24.09.2013 - 12:47
fonte

2 risposte

6

Questo è esattamente uno dei motivi per cui esistono DTO.

Il compromesso è che l'aggiunta di DTO rende la tua implementazione un po 'più complessa e quindi incline agli errori, come una mancata corrispondenza nel mappare l'oggetto dominio a un DTO. Usa i test unitari per questo!

Un'altra cosa che potresti fare con il tuo DTO e che nei servizi REST tende a essere trascurata è il trattamento dei dati ipertestuali per riferimenti, oggetti nidificati e possibili operazioni.

Fai riferimento a PoeaA di Martin Fowler: "[...] vale la pena ricordare che un altro vantaggio è quello di incapsulare il meccanismo di serializzazione per il trasferimento di dati sul filo. Incapsulando la serializzazione come questa, i DTO mantengono questa logica fuori dal resto del codice e forniscono anche un chiaro punto per cambiare la serializzazione, se lo desideri. "

link

TL; DR: Mi piace l'idea di separare le preoccupazioni della logica di dominio e il "cablaggio RESTful" attraverso DTOS, sebbene introduca un design più complesso.

    
risposta data 24.09.2013 - 16:04
fonte
3

Sebbene non sia l'intento principale di Data Transfer Objects , i DTO possono essere utilizzati per soddisfare questo problema in un modo alla porzione di dati di un modello di presentazione .

Come è stato sottolineato, questo potrebbe ingigantire il tuo design e qualcosa di così semplice come un campo aggiunto potrebbe richiedere cambiamenti a bolla attraverso i livelli aggiuntivi. Per questo motivo, è consigliabile verificare se fornire i metadati per descrivere la serializzazione dell'oggetto . In molte lingue, questo prende la forma di annotazioni specializzate che possono essere applicate agli oggetti del dominio per evitare la noiosa traduzione di DTO. Pacchetti come Jackson ( attraverso l'uso di Mixins ) spesso prendono quest'idea un po 'più lontano per separare completamente i tuoi metadati dal tuo modello di dominio.

    
risposta data 24.09.2013 - 18:32
fonte

Leggi altre domande sui tag