eredità in DTOs è una cattiva idea - DTO dovrebbe essere come auto-descrive come possibile e utilizzando i client di successione si sono effettivamente idea di cosa ritorna in ultima analisi, il servizio. Questo è il motivo per cui le classi DTO non riescono a de/serializzare correttamente nella maggior parte dei serializzatori basati su standard.
Non c'è una buona ragione per avere interfacce in DTO (e pochissimi motivi per averle su modelli POCO), è un'abitudine cult del carico di usare le interfacce per ridurre l'accoppiamento nel codice dell'applicazione che è stato trapelato senza pensieri in DTO. Ma oltre i confini del processo, le interfacce aggiungono solo l'accoppiamento (è solo ridotto nel codice) poiché il consumatore non ha idea di quale tipo concreto deserializzare, quindi deve emettere suggerimenti di implementazione specifici per la serializzazione che ora incorpora i problemi C# sul cavo (quindi ora anche Gli spazi dei nomi C# interromperanno la serializzazione) e ora vincolano la tua risposta ad essere usata da un serializzatore particolare. La dispersione dei problemi di C# sul filo viola uno degli obiettivi principali dei servizi per consentire l'interoperabilità.
Poiché non esiste il concetto di 'tipo info' nelle specifiche JSON, in modo che l'eredità di lavorare in JSON Serializzatori hanno bisogno di emettono estensioni proprietarie al JSON wireformat per includere queste informazioni tipo - che ora le coppie tua JSON carico utile a un'implementazione di serializzatore JSON specifica.
ServiceStack's JsonSerializer negozi questo tipo informazioni nella proprietà __type e dal momento che può gonfiare notevolmente il carico utile, emette solo questo tipo di informazioni per i tipi che ne hanno bisogno, vale a dire, Interfaces
object
tipi o classi abstract
tardiva.
Detto questo la soluzione potrebbe essere quella di cambiare Animal
ad essere sia un interfaccia o un astratto di classe, la raccomandazione è comunque di non utilizzare l'ereditarietà in DTOs.
Cosa fare nel caso in cui disponga di più servizi che richiedono essenzialmente lo stesso DTO? Ad esempio un servizio di registrazione utente e un servizio di manutenzione utente? Entrambi si aspettano un DTO UserAccount con alcune differenze in cui i campi devono essere compilati. Il repository si aspetta un DTO UserAccount perché sta per inserire o aggiornare la tabella UserAccount. Così ho creato un DTO UserAccount. Il DTO UserRegistration e DTO UserMaintenance ereditano da esso. [Voglio anche aggiungere qui un grande ringraziamento per aver creato ServiceStack.] – GeorgeBarker
Ugh ... per rispondere alla mia domanda/domanda apparentemente ovvia ora: un messaggio non dovrebbe "essere" un oggetto dominio aziendale, dovrebbe "contenere" uno (o Di Più). Una semplice questione di "ha" contro "è". Quindi per il mio esempio, UpdateUserMsg e RegisterUserMsg contengono entrambi un DTO UserAccount. Né sarebbe un DTO UserAccount. Non c'è bisogno di ereditarietà. – GeorgeBarker
Come gestiresti le liste senza ereditarietà? Ad esempio, diciamo che ho un DTO con una proprietà 'List', e quindi ho 20 classi diverse che implementano 'IAnimal'. –
Cocowalla