Data Transfer Objects
Data Transfer Objects (DTO)
What
Data transfer objects - as the name implies - are objects that are used to transfer data.
Very often this means sending data over a network boundary - for example via a REST-API.
Data transfer objects solely hold data values. While classes or records that are used to implement DTOs can have additional functionality as methods, the main purpose is to (de-)serialize the data fields of DTOs so they can be transfered to its destination.
Usually DTOs don’t offer functionality that goes beyond storage, retrieval and (de-)serialization of their own data.
Implementation
Commonly DTOs are implemented as simple classes with only properties (POCOs) or as record types.
public class Person { public string Name { get; set; }}// orpublic record Person(string Name);
DTOs for REST API Design
DTOs can be very useful when designing REST APIs. Consider this data model:
Entities in APIs
When using entities (for accessing and storing data) you might and up with something like this:
public class Student { [Key] public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }
// Navigation Property public Collection<Grade> Grades { get; set; } = [];}
When using the entity above in your REST API you might end up with a POST Endpoint that would require you to send data in this form when adding a new student:
{ "id": 1, "name": "Hugo", "email": "hugo@provider.com", "grades": []}
This raises at least 2 questions:
- Why do I need to specify an ID for the student? Shouldn’t the server take care of that?
- Why do I need to specify a list of grades for that student when I just want to add a student without any grades yet.
Creating DTOs for different endpoints
TODO