Entendendo Data Transfer Objects (DTOs) e Por Que Utilizá-los em Desenvolvimento C#
O que é um DTO?
O uso de DTO(Objeto de transferência de dados) é um design pattern utilizado para transferir dados entre subsistemas que se comunicam por meio de serviços ou interfaces.
um DTO por si só é uma classe simples que geralmente contem apenas propriedades(getters/setters), que servem apenas para "armazenar" os dados que ir ser distribuídos para sua aplicação.
O DTO é frequentemente usado para representar dados recuperados de uma fonte de dados, como um banco de dados, que serão serializados e enviados para o seu sistema. assim como ele pode recuperar dados o DTO também pode receber dados de entrada, validar e passar para os componentes de processamento/armazenamento do seu sistema.
Por que utilizar DTOs?
Separação de Responsabilidades
O uso de DTOs ajuda a separar as responsabilidades de um objeto, evitando que ele tenha muitas responsabilidades, o que pode tornar o código mais complexo e difícil de manter, e isso segue o pattern de design de software chamado de Single Responsibility Principle (SRP).
Redução de Acoplamento
Primeiro precisamos saber o que é um acoplamento. Acoplamento é a dependência que um objeto tem de outro, ou seja, quanto mais um objeto depende de outro, mais acoplado eles estão.
O uso de DTOs ajuda a reduzir o acoplamento entre os objetos, pois eles são usados para transferir dados entre os objetos, sem que eles tenham que conhecer a estrutura interna um do outro, e isso segue o pattern chamado de Dependency Inversion Principle (DIP).
Que é um dos princípios do SOLID.
Melhoria na Performance
O uso de DTOs pode melhorar a performance da sua aplicação, pois eles são objetos leves e simples, que são usados apenas para transferir dados entre os objetos, sem que eles tenham que executar muitas operações.
Suporte a Serialização e Desserialização
Primeiro precisamos saber o que é serialização e desserialização.
Serialização é o processo de converter um objeto em um formato que pode ser armazenado ou transmitido.
E desserialização é o processo de converter um objeto serializado de volta para um objeto.
Json e Xml são exemplos de formatos de serialização.
O uso de DTOs ajuda a suportar a serialização e desserialização de objetos, pois eles são usados para transferir dados entre os objetos, e podem ser facilmente convertidos em um formato que pode ser armazenado ou transmitido.
Exemplo Utilizado em um Dos Meus Projetos
public class ProdutoDTO
{
[Required]
public string Nome { get; set; }
[Required]
public string Descricao { get; set; }
[Required]
public double Valor { get; set; }
public IFormFile? Imagem { get; set; }
}
Neste exemplo, o DTO é usado para transferir dados entre o controlador e o serviço, e ele contém as propriedades que serão usadas para criar um novo produto.
No meu contexto estou serializando o DTO para um formato Json, para que ele possa ser transmitido pela rede.
Como mostra o Exemplo:
[HttpPost]
public async Task<ActionResult<Produto>> Post([FromForm] ProdutoDTO produtoModel)
{
var guid = Guid.NewGuid().ToString();
var produto = new Produto()
{
Nome = produtoModel.Nome,
Descricao = produtoModel.Descricao,
Valor = produtoModel.Valor
};
if (produtoModel.Imagem != null)
{
var nomeArquivo = guid + Path.GetExtension(produtoModel.Imagem.FileName);
var urlImagem = Path.Combine("imagens", nomeArquivo);
var caminhoArquivo = Path.Combine(Directory.GetCurrentDirectory(),"imagens", nomeArquivo);
using (var stream = new FileStream(caminhoArquivo, FileMode.Create))
{
await produtoModel.Imagem.CopyToAsync(stream);
}
produto.Imagem = urlImagem;
}
_context.Produtos.Add(produto);
await _context.SaveChangesAsync();
// Retorna a resposta CreatedAtAction
return CreatedAtAction("Get", new { id = produto.ProdutoId }, produto);
}
}
Neste exemplo, o DTO é usado para transferir os dados do ProdutoDTO para o Produto, e ele contém as propriedades que serão usadas para criar um novo produto.
Conclusão
O uso de DTOs é uma prática comum em muitos projetos de software, e pode trazer muitos benefícios, como a separação de responsabilidades, a redução de acoplamento, a melhoria na performance, o suporte a serialização e desserialização, entre outros.
Se você ainda não está usando DTOs em seus projetos, eu recomendo que você comece a usá-los, pois pode ajudar a melhorar a qualidade do seu código e a tornar o seu sistema mais fácil de manter e evoluir.
Espero que este artigo tenha sido útil para você, e que você tenha aprendido algo novo sobre DTOs.
Aqui vai o link para o meu repositório do GitHub onde eu utilizo DTOs em um projeto pratico de API com ASP.NET: