Criando um repositório genérico para Linq to SQL

Vou demonstra aqui uma forma bem rápida e produtiva para criarmos um repositório genérico com Linq to SQL. Basicamente devemos efetuar quatro operações básicas: Selecionar os dados, salvar, apagar e atualizar.

Vejamos como ficaria nossa interface para o repositório genérico:

public interface IRepositorio
{
   void Atualiza();

   void Apaga<TEntidade>(TEntidade entidade) where TEntidade : class;

   void Salva<TEntidade>(TEntidade entidade) where TEntidade : class;

   IQueryable<TEntidade> Seleciona<TEntidade>() where TEntidade : class;
}

Pegou a idéia com Generics? veja a implementação:

public class Repositorio : IRepositorio
{
    private readonly DBDataContext _db;

    public Repositorio (DBDataContext db)
    {
        _db = db;
    }

    public void Atualiza()
    {
        _db.SubmitChanges();
    }

    public void Apaga<TEntidade>(TEntidade entidade) where TEntidade : class
    {
        _db.GetTable<TEntidade>().DeleteOnSubmit(entidade);
        Atualiza();
    }

    public void Salva<TEntidade>(TEntidade entidade) where TEntidade : class
    {
        _db.GetTable<TEntidade>().InsertOnSubmit(entidade);
        Atualiza();
    }

    public IQueryable<TEntidade> Seleciona<TEntidade>() where TEntidade : class
    {
        return _db.GetTable<TEntidade>();
    }
}

Legal não? Simples e eficaz. Veja como podemos utilizar este repositório:

public class Negocio : INegocio
{
    private static IRepositorio _repositorio;

    public Negocio(IRepositorio db)
    {
        _repositorio = repositorio;
    }

    public void Chamadas()
    {
	//Seleciona os registros (Produtos)
 	IQueryable<Produto> colecao = _repositorio.Seleciona<Produto>();

	Produto produto = colecao.Where(p => p.cod == 1).FirstOrDefault();

	produto.nome = "caixa";

	//Submete as alterações no produto selecionado
	_repositorio.Atualiza();

	Produto p = new Produto() { nome = "Caixa", valor = 100 };	

	//Salva o novo produto
	_repositorio.Salva<Produto>(p);

	//Apaga o produto
	_repositorio.Apaga<Produto>(p);
    }
}

Claro que o uso de outros conceitos e patterns como IoC e UoW são essenciais!

Bom código! Wink

 

5 comentários sobre Criando um repositório genérico para Linq to SQL

  1.  

    Não estaria faltando neste repositório um método para “Update” das entidades?

    • Olá João,

      Na verdade não, quando trabalhamos com Linq to SQL nossos updates são realizados efetuando um SubmitChanges() no próprio contexto, ou seja o método Atualiza(), veja:

      Produto produto = colecao.Where(p => p.cod == 1).FirstOrDefault();
      produto.nome = “caixa”;

      //Submete as alterações no produto selecionado (UPDATE)
      _repositorio.Atualiza();

      Isso seria um update!

      Abs

       
      •  

        Entendi, essa técnica vale também para o linq to entities.

        Tenho trabalhado o linq to entities com o MVC 2 e 3 mas usando as técnicas utilizadas no MVC 1 (repository e service).

        Creio que está na hora de atualizar minha abordagem ao banco de dados.

        Valeu pela resposta.

        Abs

  2.  

    Ops, aqui é uma pergunta:

    Entendi, essa técnica vale também para o linq to entities?

leave your comment


*