Migrando de DAAB para Dapper


Um dos pilares do antigo Enterprise Library é o DAAB (Data Access Application Block), e como o próprio nome diz, é um componente que auxilia na extração de dados de uma base de dados relacional. Sua API fornece métodos que permitem executar consultas que retornam valore escalares e também materializar o resultado em objetos.

É importante salientar que ele não é um ORM, e sendo assim, não rastreia mudanças em objetos depois que eles são materializados; compete ao cliente que faz uso desta biblioteca gerenciar tais mudanças que ocorrem nos mesmos, para depois devolver as alterações para a base de dados executando comandos de UPDATE, DELETE ou INSERT.

Abaixo um exemplo simples de como materializar o resultado para um objeto. Além da consulta SQL, temos que ter um gerador de parâmetros que os cria e anexa ao comando e, por fim, um builder, que permite customizar o mapeamento entre o resultado e as propriedades expostas pela classe mencionada.

var cliente =
database.CreateSqlStringAccessor<Cliente>
(
@”
SELECT
 c.ClienteId As ‘Id’
, e.RazaoSocial
, e.Cnpj
FROM Cliente c
INNER JOIN Empresa e ON e.EmpresaId = c.EmpresaId
WHERE
c.ClienteId = @p0″,
new ParameterMapper(),
MapBuilder<Cliente>
.MapNoProperties()
.MapByName(c => c.Id)
.MapByName(c => c.RazaoSocial)
.MapByName(c => c.Cnpj)
.Build()
).Execute(clienteId).SingleOrDefault();

O método CreateSqlStringAccessor<TResult> possui uma sobrecarga que permite apenas passar a consulta, e o mapeamento é feito de forma automática se ele encontrar as propriedades com os mesmos nomes das colunas. Além destes facilitadores para converter o resultado em objetos conhecidos pela aplicação, o DAAB gerencia a conexão para nós, ou seja, ele abre o mais tarde e fecha o mais cedo possível.

Isso é válido, pois evita precisamos gerenciar manualmente a conexão, pois algum descuido pode deixá-la aberta consumindo recursos desnecessários ou esgotar a quantidade máxima de conexões que o banco de dados possui. Só que em alguns casos o que queremos é manter a conexão aberta para executar mais de uma consulta, pois o fechamento e a abertura logo em seguida pode ser mais oneroso do que mante-la aberta por um curto período de tempo. E quando isso é necessário, temos novamente que voltar a lidar com as classes já tão conhecidas para trabalhar com dados no .NET (Connection, Command, DataReader, Parameter, etc.).

Infelizmente já faz algum tempo que esta biblioteca não sofre atualização (2013). Como uma – boa – alternativa, um Micro-ORM chamado Dapper foi criado por Sam Saffron e Marc Gravell para ser usado pelo site StackOverflow (um grande case de performance) e hoje é open-source e pode ser utilizado por nossas aplicações. Ele foi criado com foco em performance, otimizando e reutilizando internamente objetos para tornar as consultas recorrentes cada vez mais veloz.

A sua API é extremamente simples, e faz uso de métodos de extensão na sobre a interface IDbConnection para materializar o resultado em objetos. Através de um método genérico chamado Query<T>, nós informamos a consulta SQL, e a parametrização é bem mais simples de se configurar, pois basta informar os parâmetros através de objetos anônimos, que o Dapper irá mapear as propriedades do objeto em parâmetros na consulta SQL.

using (var conn = new SqlConnection(“Data Source=.;Initial Catalog=Dados;Integrated Security=True”))

{
    var cliente = conn.Query<Cliente>

(@”
SELECT
              c.ClienteId As ‘Id’
    , e.RazaoSocial
    , e.Cnpj
FROM Cliente c
INNER JOIN Empresa e ON e.EmpresaId = c.EmpresaId
WHERE
    c.ClienteId = @id”, new { id = 2688 }
).SingleOrDefault();

    Console.WriteLine(cliente.RazaoSocial);
}

Aqui, como podemos notar, somos nós que temos que gerenciar a conexão, mas ao contrário do que ocorre com o DAAB, a forma de se escrever é bem mais simples. E como é possível notar no próprio site do projeto, o uso desta biblioteca é extremamente eficiente.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s