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

Standard

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 thoughts on “Criando um repositório genérico para Linq to SQL

    • rafaelzaccanini

      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

      • João Prado

        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

Leave a Reply

Your email address will not be published. Required fields are marked *