Desenvolvimento - C#
Trabalhando com Repositório Genérico no Entity Framework
Este artigo descreve como podemos implementar o repositório genérico no Entity Framework para desenvolvimento rápido da camada de acesso a dados.
por Pedro Henrique Barbosa Fernandes
Neste artigo vou mostrar como podemos criar um repositório genérico no Entity Framework.
Primeiramente para quem ainda não sabe, irei explicar resumidamente o que é um repositório.
O Repositório ou Repository, é um objeto geralmente associado a um objeto de negócio como um objeto cliente, por exemplo, responsável por acessar a base de dados, como no exemplo abaixo:
Objeto de negócio:
public class Cliente {
public int Id {get; set; }
public int Nome {get; set; }
}
Repositório:
public class RepositorioCliente
{
public void Adiciona(Cliente cliente)
{
}
public void Edita(Cliente cliente)
{
}
public Cliente ObtemPorId(int Id)
{
}
public void Deleta(Cliente cliente)
{
}
}
Para usar faríamos assim:
repositorioCliente repositorio = new RepositorioCliente();
repositório.Adiciona(Cliente);
Seguindo o exemplo acima, em um sistema mais complexo teríamos que criar um RepositorioFornecedor, um RepositorioFatura etc.. criando os respectivos métodos de acesso a dados para cada repositório.
Vamos então implementar um repositório genérico, isto é, um repositório padrão que terá os métodos de criar, editar, deletar e obter onde precisamos apenas informar qual objeto de negócio desejamos trabalhar no repositório genérico.
Vamos lá, primeiro vamos criar uma interface IRepositorio:
public interface IRepositorio<T> where T : class
{
void Adicionar(T item);
void Remover(T item);
void Editar(T item);
T ObtemPorId(object id);
IQueryable<T> Tudo();
}
Note que a interface possui um parâmetro genérico T, iremos tipar o repositório para o objeto de negócio que desejamos usar.
Vamos agora criar o repositório genérico:
public class Repositorio<T> : IDisposable, IRepositorio<T> where T : class
{
protected readonly DbContext contexto;
public Repositorio(DbContext contexto)
{
this.contexto = contexto;
}
public virtual void Adicionar(T item)
{
contexto.Set<T>().Add(item);
contexto.SaveChanges();
}
public virtual void Remover(T item)
{
contexto.Set<T>().Remove(item);
contexto.SaveChanges();
}
public virtual void Editar(T item)
{
contexto.Entry(item).State = EntityState.Modified;
contexto.SaveChanges();
}
public virtual T ObtemPorId(object id)
{
return contexto.Set<T>().Find(id);
}
public virtual IQueryable<T> Tudo()
{
return contexto.Set<T>();
}
public void Dispose()
{
contexto.Dispose();
}
}
Simples, agora para usar fazemos o seguinte:
using (IRepositorio<Cliente> repositorio = new Repositorio<Cliente>())
{
repositorio.Adiciona(objetoCliente);
}
Ou para uma consulta com LINQ:
using (IRepositorio<Cliente> repositorio = new Repositorio<Cliente>())
{
var lista = from p in repositório.Tudo()
select p;
}
Com este exemplo podemos ver o potencial que o Entity Framework nos oferece para acesso a dados.
Observação:
É importante o método Tudo() ser do tipo IQueryable, dessa forma o IQueryable armazena as operações que estamos fazendo nele com o LINQ e executa a consulta no banco de dados apenas quando vamos acessar os dados.