Estava lendo alguns artigos sobre as vantagens da criação de repositórios genéricos para um novo aplicativo ( exemplo ). A ideia parece boa porque me permite usar o mesmo repositório para fazer várias coisas para vários tipos de entidade diferentes ao mesmo tempo:
IRepository repo = new EfRepository(); // Would normally pass through IOC into constructor
var c1 = new Country() { Name = "United States", CountryCode = "US" };
var c2 = new Country() { Name = "Canada", CountryCode = "CA" };
var c3 = new Country() { Name = "Mexico", CountryCode = "MX" };
var p1 = new Province() { Country = c1, Name = "Alabama", Abbreviation = "AL" };
var p2 = new Province() { Country = c1, Name = "Alaska", Abbreviation = "AK" };
var p3 = new Province() { Country = c2, Name = "Alberta", Abbreviation = "AB" };
repo.Add<Country>(c1);
repo.Add<Country>(c2);
repo.Add<Country>(c3);
repo.Add<Province>(p1);
repo.Add<Province>(p2);
repo.Add<Province>(p3);
repo.Save();
No entanto, o restante da implementação do Repositório depende muito do Linq:
IQueryable<T> Query();
IList<T> Find(Expression<Func<T,bool>> predicate);
T Get(Expression<Func<T,bool>> predicate);
T First(Expression<Func<T,bool>> predicate);
//... and so on
Esse padrão de repositório funcionou de maneira fantástica para o Entity Framework e praticamente ofereceu um mapeamento de 1 para 1 dos métodos disponíveis no DbContext / DbSet. Mas, dada a lenta adoção do Linq em outras tecnologias de acesso a dados fora do Entity Framework, que vantagem isso oferece sobre o trabalho diretamente com o DbContext?
Tentei escrever uma versão PetaPoco do Repositório, mas o PetaPoco não suporta Linq Expressions, o que torna a criação de uma interface genérica de IRepository praticamente inútil, a menos que você a use apenas para GetAll, GetById, Adicionar, Atualizar, Excluir e Salvar. métodos e utilizá-lo como uma classe base. Então você deve criar repositórios específicos com métodos especializados para lidar com todas as cláusulas "where" que eu poderia transmitir anteriormente como predicado.
O padrão do Repositório Genérico é útil para qualquer coisa fora do Entity Framework? Caso contrário, por que alguém usaria isso em vez de trabalhar diretamente com o Entity Framework?
O link original não reflete o padrão que eu estava usando no meu código de exemplo. Aqui está um ( link atualizado ).