Czytałem kilka artykułów na temat zalet tworzenia Ogólnych repozytoriów dla nowej aplikacji ( przykład ). Pomysł wydaje się miły, ponieważ pozwala mi używać tego samego repozytorium do robienia kilku rzeczy dla kilku różnych typów jednostek jednocześnie:
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();
Reszta implementacji repozytorium jest jednak w dużym stopniu zależna od 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
Ten wzorzec repozytorium działał fantastycznie dla Entity Framework i prawie oferował mapowanie 1 do 1 metod dostępnych w DbContext / DbSet. Ale biorąc pod uwagę powolne wdrażanie Linq w innych technologiach dostępu do danych poza Entity Framework, jaką to daje przewagę nad bezpośrednią pracą z DbContext?
Próbowałem napisać PetaPoco wersję repozytorium, ale PetaPoco nie obsługuje Linq wyrażeń, co sprawia, tworząc ogólną IRepository interfejs prawie bezużyteczne, chyba że tylko używać go do podstawowego GETALL, GetById, dodawać, aktualizować, usuwać i Zapisz metody i wykorzystać jako klasę podstawową. Następnie musisz utworzyć określone repozytoria za pomocą specjalistycznych metod do obsługi wszystkich klauzul „gdzie”, które wcześniej mogłem przekazać jako predykat.
Czy wzorzec Ogólnego repozytorium jest użyteczny dla czegokolwiek poza Entity Framework? Jeśli nie, to dlaczego ktoś miałby go używać zamiast pracować bezpośrednio z Entity Framework?
Oryginalny link nie odzwierciedla wzoru, którego użyłem w moim przykładowym kodzie. Oto ( zaktualizowany link ).