.NET
- Data Transfers Objects - DTOs
![]() |
Hoje vamos rever o conceito dos Data Transfers Objects - DTOs. |
Os Data Transfer Objects (DTOs) são objetos usados para transferir dados entre diferentes camadas ou componentes da aplicação.
Eles são usados para encapsular e transportar apenas as informações relevantes de um objeto de domínio para as partes interessadas, como as camadas de apresentação, serviços ou integração com bancos de dados.
Os DTOs atuam como uma "ponte" para transferência de dados, permitindo uma comunicação mais eficiente e controlada entre as diversas partes do sistema. Eles oferecem algumas vantagens, tais como:
Vamos mostrar um exemplo bem simples e para isso vamos criar um projeto Console no VS 2022 chamado AppDTO.
No projeto crie a pasta Entities e a seguir crie a classe Funcionario nesta pasta:
public class Funcionario { public int Id { get; set; } public string Nome { get; set; } public string Sobrenome { get; set; } public char Sexo { get; set; } public string Email { get; set; } public decimal Salario { get; set; } } |
Agora, vamos considerar um cenário onde você deseja buscar informações dos funcionários no banco de dados e transferi-las usando DTOs onde deseja obter o nome completo do funcionário.
Para isso vamos criar uma pasta DTOs no projeto e nesta pasta criar a classe FuncionarioDTO:
public class FuncionarioDTO { public int Id { get; set; } public string NomeCompleto { get; set; } public char Sexo { get; set; } public string Email { get; set; } public decimal Salario { get; set; } } |
No arquivo Program do projeto vamos definir o código abaixo:
using AppDTO.DTOs; using AppDTO.Entities; // Simulando a busca de funcionários do banco de dados // Mapear os objetos Funcionario para FuncionarioDTO // Exibir os dados usando DTOs Console.ReadKey(); static List<Funcionario> ObterFuncionariosDoBanco() static List<FuncionarioDTO> MapearParaDTO(List<Funcionario> funcionarios) foreach (var funcionario in funcionarios) return funcionariosDTO; |
Executando o projeto teremos o seguinte resultado:
Nesse exemplo, estamos simulando a busca de funcionários no banco de dados, mapeando os objetos da entidade Funcionario para DTOs da classe FuncionarioDTO e, em seguida, exibindo as informações usando os DTOs.
O método MapearParaDTO é responsável por converter uma lista de objetos da entidade Funcionario em uma lista de objetos DTO da classe FuncionarioDTO. O processo de mapeamento envolve a transferência de dados relevantes da entidade para o DTO, para que esses dados possam ser usados em diferentes camadas da aplicação sem expor detalhes internos da estrutura da entidade.
Agora imagine uma aplicação ASP.NET Core onde temos as entidades Categoria e Produto com um relacionamento um para muitos entre categoria e produto. Neste cenário em um controlador CategoriasController podemos ter um endpoint para retornar as categorias com seus produtos.
Para fazer isso sem obter um erro de referência cíclica vamos criar os DTOs:
CategoriaDTO
public
class
CategoriaDTO { public int CategoriaId { get; set; } public string? Nome { get; set; } public string? ImagemUrl { get; set; } } |
ProdutoDTO
public
class
ProdutoDTO { public int ProdutoId { get; set; } public string? Nome { get; set; } public string? Descricao { get; set; } public decimal Preco { get; set; } public string? ImagemUrl { get; set; } public float Estoque { get; set; } public DateTime DataCadastro { get; set; } public CategoriaDTO? Categoria { get; set; } } |
CategoriaComProdutosDTO
public
class
CategoriaComProdutosDTO { public int CategoriaId { get; set; } public string Nome { get; set; } public string? ImagemUrl { get; set; } public ICollection<ProdutoDTO>? Produtos { get; set; } } |
A seguir no controlador CategoriasController podemos definir o endpoint para retornar as categorias com seus produtos:
public class CategoriasController : ControllerBase { private readonly AppDbContext _dbContext;
public CategoriasController(AppDbContext dbContext) [HttpGet] foreach (var categoria in categorias) categoriasComProdutosDTO.Add(categoriaComProdutosDTO); return Ok(categoriasComProdutosDTO); |
Essa é uma forma manual de realizar o mapeamento entre as entidade e os DTOs para obter o resultado esperado. (Podemos usar uma biblioteca de terceiros, como o AutoMapper, para nos ajudar a realizar este mapeamento.)
O uso de DTOs ajuda a isolar a camada de apresentação da camada de persistência de dados, melhorando a separação de preocupações na aplicação.
Pegue o projeto aqui: AppDTO.zip
"Porque para mim o viver é Cristo, e o morrer é ganho."
Filipenses 1:21
Referências:
C# - Obtendo a data e a hora por TimeZone
C# - O Struct Guid - Macoratti.net
C# - Checando Null de uma forma mais elegante
DateTime - Macoratti.net
Null o que é isso ? - Macoratti.net
Formatação de data e hora para uma cultura ...
C# - Calculando a diferença entre duas datas
NET - Padrão de Projeto - Null Object Pattern
C# - Fundamentos : Definindo DateTime como Null ...
C# - Os tipos Nullable (Tipos Anuláveis)