Acesso a dados com Dapper .NET

5 set

Fala galera,

Umas das operações quando nós construirmos uma aplicação é como faremos o acesso os dados em uma base relacional. Ao longo dos anos como desenvolvedor .NET fiquei pensando como seria como aliar a produtividade para acessar dados junto com performance do banco de dados. Tempos atrás quando desenvolvíamos aplicações a onda do momento era fazer “Store Procedure” para acesso a dados, porém sempre caímos na questão da produtividade em se construir uma aplicação. Depois surgiu o .NET 3.5 e com ele o Linq2Sql e mais recente o Entity Framework, ganhamos muito em produtividade mas todos sabíamos que o Linq2Sql não era nada performático. E até o Entity Framework em algumas situações não consegue ser performático ainda mais quando precisamos de sistemas transicionais que recebe milhares de requisições por segundo.

Então eis que surge o conceito de Micro-ORM, esses frameworks são diretamente construídos em cima do ADO.NET, usam Reflection para criar os objetos diretamente de um DataReader e são bem simples e performáticos de ser usar. Eis alguns Micro-ORM

Usando Dapper

Para nosso post, irei demonstrar o uso do Dapper, ele foi construído pelo pessoal do StackOverflow, como todos sabem o StackOverflow é um site bem acessado e uns dos mais famosos para consultas e dúvidas sobre programação.

O Dapper está no NuGet então para usar basta fazer a instalação através do Package Manager Console

Dapper

Neste exemplo, eu criei uma aplicação WebApi e criei a alguns modelos basicamente são de Produtos e Fornecedor, conforme código abaixo

public class Product
{
   public int Id { get; set; }
   public string ProductName { get; set; }
   public int SupplierID { get; set; }
   public decimal UnitPrice { get; set; }
   public short UnitsInStock { get; set; }
   public short UnitsOnOrder { get; set; }
   public Supplier Supplier { get; set; }
}
public class Supplier 
{
   public int Id { get; set; }
   public string CompanyName { get; set; }
   public string ContactName { get; set; }
   public string ContactTitle { get; set; }
   public string City { get; set; }
   public string Country { get; set; }

   public IEnumerable<Product> Products { get; set; }
}

 

Com o nosso modelo criado, vamos criar o acesso ao dados. Irei criar uma classe de repositório para acessar meus modelos.

public class ProductRepository
{
        public string ConnectionString = ConfigurationManager.ConnectionStrings["DapperSampleConnection"].ToString();

        public List<Product> GetProducts()
        {
            List<Product> products = new List<Product>();

            using (var sqlConnection = new SqlConnection(ConnectionString)) 
            {
                var result = sqlConnection.Query<Product>("Select * from Product");

                foreach (Product product in result) 
                    products.Add(product);
            }

            return products;
        }

        public List<Product> GetProductBySupplier(int supplierId) 
        {

            var query = @" Select * from Product
                           join Supplier on Product.SupplierId = Supplier.Id
                           where SupplierId = @SupplierId; ";

            using (var sqlConnection = new SqlConnection(ConnectionString))
            {
                var products = sqlConnection.Query<Product>(query, new { SupplierId = supplierId });

                return products.ToList();
            }
        }

        public Product GetProductById(int productId) 
        {
            using (var sqlConnection = new SqlConnection(ConnectionString))
            {
                return sqlConnection.Query<Product>("Select * from Product where Id = @Id", new { Id = productId }).SingleOrDefault();
            }

        }

 }

 

Agora vamos gerar o repositório de fornecedor, nele somente estará as operações de manipulação de dados.

public class SupplierRepository
   {
       public string ConnectionString = ConfigurationManager.ConnectionStrings["DapperSampleConnection"].ToString();

       public void Save(Supplier model) 
       {
           using (var sqlConnection = new SqlConnection(ConnectionString)) 
           {
               sqlConnection.Execute("INSERT INTO SUPPLIER(CompanyName,ContactName, City, Country) VALUES (@CompanyName, @ContactName, @City, @Country)", model);
           }
       }

       public void Update(Supplier model) 
       {
           using (var sqlConnection = new SqlConnection(ConnectionString)) 
           {
               sqlConnection.Execute(@"UPDATE SUPPLIER
                                       SET CompanyName = @CompanyName, 
                                           ContactName = @ContactName,
                                           City = @City,
                                           Country = @Country
                                       WHERE ID = @Id", model);
           }
       }

       public void Delete(Supplier model) 
       {
           using (var sqlConnection = new SqlConnection(ConnectionString)) 
           {
               sqlConnection.Execute("DELETE FROM SUPPLIER WHERE ID = @Id", model);
           }
       }

   }

Neste post, vimos alguns cenários básicos de acesso a dados. O Dapper contem alguns outros plugins que tornam o acesso muito mais intuitivo como Dapper Contrib
Por se tratar de um mini-ORM, com o Dapper não necessitamos criar um mapeamento entre os objetos de modelos e a camada de dados porém algumas tarefas podem se tornar massivas.

Você pode pegar os código fonte deste post clicando aqui

Abs e até a próxima.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *