Want create site? Find Free WordPress Themes and plugins.

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&lt;Product&gt;("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.

Rafael Cruz

É desenvolvedor .NET há mais de 12 anos, certificado Microsoft desde de 2006, instrutor oficial Microsoft há 5 anos, Pós Graduado em Engenharia de Software pela UFRJ, suas certificações são Microsoft Certified Trainer, Microsoft Certified Solution Developer (Web, Application Lifecycle Management), Microsoft Certified Professional Developer, Microsoft Certified Tecnology Specialist.
Atualmente trabalha como arquiteto de sistema, escreve artigos no .NET Coders e no seu blog rafaelcruz.azurewebsites.net para compartilhar experiências na área de desenvolvimento Web, Aplicativos Móveis e Cloud Solutions.

Twitter LinkedIn 

Did you find apk for android? You can find new Free Android Games and apps.

Comentários

comentarios