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
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.