Dapper: exemplos de utilização em ASP.NET Core e .NET Full

Renato Groffe
4 min readJul 2, 2017

--

Frameworks ORM surgiram com o objetivo de simplificar a conversão de informações estruturadas em objetos, contribuindo para uma maior produtividade na construção de aplicações que dependam de bancos de dados relacionais. As principais plataformas de desenvolvimento da atualidade contam com soluções deste tipo, existindo inclusive um grande engajamento de comunidades técnicas na implementação de projetos ORM.

No caso da plataforma .NET temos atualmente o Entity Framework e o NHibernate como frameworks ORM mais populares. Embora úteis num grande número de situações, estas alternativas podem apresentar limitações em cenários mais específicos. Consultas envolvendo tabelas com grandes volumes de informações constituem um bom exemplo disto: as instruções geradas por meio de uma solução ORM nem sempre serão executadas da forma mais performática possível.

E como então superar este tipo de problema envolvendo consultas?

Um caminho seria empregar recursos básicos do ADO.NET, além de utilizar instruções SQL escritas de forma a se beneficiar de índices que otimizem o seu processamento. Esta alternativa pode, entretanto, não ser tão produtiva em termos de codificação.

É neste ponto que o micro-ORM Dapper entra em ação. Embora não possua todas as funcionalidades típicas de um ORM convencional, este framework disponibiliza Extension Methods que simplificam em muito o trabalho com os objetos de conexão do ADO.NET (neste último caso implementações da interface IDbConnection).

Esta característica (integração com o ADO.NET) permite que o Dapper seja utilizado para acessar qualquer tecnologia relacional compatível com o .NET. O SQL Server, o Oracle, o PostgreSQL e o MySQL são alguns exemplos de SGDBs possíveis.

Tabelas, views e stored procedures estão entre as estruturas suportadas pelo Dapper. Transações criadas a partir de um objeto de conexão também podem ser usadas em operações envolvendo inserções, atualizações e exclusões de registros.

A seguir é possível observar um exemplo de utilização do Dapper em ASP.NET Core:

  • Os métodos Query e QueryFirstOrDefault são extensões que este framework disponibiliza para uso a partir da classe SqlConnection (empregada na conexão com uma base do SQL Server);
  • Este trecho de código aborda ainda a utilização de queries e de uma procedure para a consulta de dados com o Dapper;
  • Recomenda-se também a passagem de parâmetros por meio de um objeto anônimo (devendo coincidir o nome de cada propriedade com a identificação do respectivo parâmetro). Esta prática tem por finalidade evitar falhas que levem a ataques do tipo SQL Injection, algo bastante possível em instruções geradas via concatenação de strings.

Já abordei o uso do Dapper em um artigo anterior, utilizando o mesmo juntamente com o ASP.NET Core e o SQL Server:

ASP.NET Core: criando uma API REST com Dapper e SQL Server

E também em um Live Demo do Canal .NET, no qual demonstrei a implementação de uma API REST em Linux com o ASP.NET Core e o Visual Studio Code:

O Dapper também foi assunto de uma apresentação que realizei recentemente:

Para esta palestra implementei diversos exemplos em .NET Full e ASP.NET Core, disponibilizando os mesmos no GitHub:

https://github.com/renatogroffe/Exemplos_Dapper

Neste repositório há aplicações que fazem uso dos seguintes packages:

  • Dapper: biblioteca principal para uso deste micro-ORM;
  • Dapper.Contrib: extensões adicionais do Dapper que simplificam operações de CRUD, de maneira a dispensar a inclusão de expressões SQL (SELECT, INSERT, UPDATE e DELETE) em código C#.

Estes projetos demonstram a utilização de tabelas, views e procedures com o Dapper, além da implementação de controle transacional e como converter o resultado de uma consulta ao se empregarem objetos compostos (formados por entidades que correspondem a mais de uma tabela).

As próximas listagens trazem um exemplo similar ao trecho de código anterior, já empregando o Dapper.Contrib. Primeiramente será definida uma classe representando uma entidade (Estado), mapeando-se na mesma o nome da tabela e sua chave primária (através dos atributos Table e ExplicitKey, ambos pertencentes ao namespace Dapper.Contrib.Extensions):

Já no Controller os Extension Methods GetAll e Get dispensam o uso de queries para a obtenção dos dados:

E por falar em tecnologias Microsoft, não deixem também de acompanhar o Azure Tech Nights, que acontecerá entre os dias 24 de Julho e 2 de Agosto de 2017. Será um evento NOTURNO, ONLINE e GRATUITO promovido pelo Canal .NET, com apresentações focadas no Microsoft Azure e cobrindo temas como microserviços, Bots, desenvolvimento Web e mobile, bancos de dados, Business Intelligence, NoSQL, infraestrutura, Containers e muito mais.

Entre os palestrantes teremos MVPs Microsoft, MTACs e Especialistas de Mercado.

Para efetuar a inscrição acessem este link.

A grade com as palestras e outras informações podem ser encontradas no site oficial do Azure Tech Nights.

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker