Le proprietà in Data Transfer Object espandono le chiavi esterne o espongono semplicemente le loro chiavi primarie
-
28-10-2019 - |
Domanda
Ho un EmployeeDTO che rappresenta un record Employee nel database.La tabella Employee ha una relazione con un dipartimento e una relazione uno a molti con l'autorizzazione.
Nelle mie entità, questi sono rappresentati come una proprietà Department completamente espansa e un elenco di oggetti autorizzazione completamente espansi.
La domanda è: il DTO dovrebbe avere una proprietà DepartmentDTO completamente espansa di un DepartmentId?Il DTO dovrebbe avere un elenco di proprietà PermissionDTO completamente espanse di List of PermissionId?
Soluzione
Proprio come tutto nel design, dipende dalle tue esigenze.
- Se hai bisogno di vedere spesso e bind a proprietà figlio e vuoi per renderlo il più semplice possibile sviluppatori per utilizzare i tuoi DTO, potresti vogliono metodi di fabbrica espliciti da dare hai completamente espanso le proprietà figlio.
- Se vuoi la semplicità del codice, non farlo espandere le proprietà della chiave esterna e lascia che gli sviluppatori prendano il bambino oggetto / collezioni che vogliono per chiave secondo necessità.
Potresti incontrare problemi con la ricorsione; espandi anche tutte le proprietà della chiave esterna dell'oggetto Department? E se c'è un riferimento a un altro EmployeeDTO in una sottoclasse di Dipartimento?
Entity Framework di Microsoft, così come altri framework di oggetti di business popolari, gestiscono questo concetto mediante caricamento lento: recupera la proprietà figlio espansa completa solo se è richiesta dal codice. Questa è probabilmente la soluzione più flessibile, ma ha un piccolo sovraccarico / ritardo poiché le proprietà figlio non possono essere recuperate nella stessa chiamata al database dell'oggetto padre. Questi ovviamente non sono puramente DTO.
Altri suggerimenti
Sì e No. Dipende dalla chiamata e dalla necessità di tutte le proprietà extra in ogni chiamata.Può anche dipendere dalla tecnologia ORM che utilizzi, che può implementare il caricamento lento e può influire sulla tua decisione (se stai passando oggetti entità semplici anche se non è consigliato ).
È comune creare un caso DTO contenente tutte le proprietà necessarie e uno o più oggetti DTO che espongono più funzionalità e vengono utilizzati altri metodi.Ad esempio, ho una classe BasicUser
che contiene solo UserName
e DisplayName
e ho User
che ne contiene di più, inclusi Permissions
ed inherits da `BasicUser.