Article image
Miguel Gonçalves
Miguel Gonçalves14/04/2024 12:39
Compartilhe

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:

    https://github.com/Miguel084/SmartMenu-API

    Compartilhe
    Comentários (0)