Estaba leyendo algunos artículos sobre las ventajas de crear repositorios genéricos para una nueva aplicación ( ejemplo ). La idea parece agradable porque me permite usar el mismo repositorio para hacer varias cosas para varios tipos de entidades diferentes a la vez:
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();
Sin embargo, el resto de la implementación del Repositorio depende mucho de 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
Este patrón de repositorio funcionó de maravilla para Entity Framework, y prácticamente ofreció una asignación 1 a 1 de los métodos disponibles en DbContext / DbSet. Pero dada la lenta incorporación de Linq en otras tecnologías de acceso a datos fuera de Entity Framework, ¿qué ventaja ofrece esto sobre trabajar directamente con DbContext?
Intenté escribir una versión de PetaPoco del Repositorio, pero PetaPoco no es compatible con Expresiones de Linq, lo que hace que crear una interfaz genérica de IRepository sea bastante inútil a menos que solo lo use para GetAll, GetById, Add, Update, Delete y Save básicos. métodos y utilizarlo como una clase base. Luego, debe crear repositorios específicos con métodos especializados para manejar todas las cláusulas "where" que anteriormente podría pasar como predicado.
¿El patrón de repositorio genérico es útil para algo fuera de Entity Framework? Si no, ¿por qué alguien lo usaría en lugar de trabajar directamente con Entity Framework?
El enlace original no refleja el patrón que estaba usando en mi código de muestra. Aquí hay un ( enlace actualizado ).