Ich habe einige Artikel über die Vorteile des Erstellens von generischen Repositorys für eine neue App gelesen ( Beispiel ). Die Idee scheint gut zu sein, da ich mit demselben Repository mehrere Dinge für verschiedene Entitätstypen gleichzeitig ausführen kann:
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();
Der Rest der Implementierung des Repository ist jedoch stark von Linq abhängig:
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
Dieses Repository-Muster funktionierte hervorragend für Entity Framework und bot praktisch eine 1: 1-Zuordnung der in DbContext / DbSet verfügbaren Methoden. Welchen Vorteil bietet dies angesichts der langsamen Einführung von Linq in andere Datenzugriffstechnologien außerhalb von Entity Framework gegenüber der direkten Arbeit mit DbContext?
Ich habe versucht, eine PetaPoco- Version des Repository zu schreiben , aber PetaPoco unterstützt Linq Expressions nicht. Daher ist das Erstellen einer generischen IRepository-Schnittstelle so gut wie nutzlos, es sei denn, Sie verwenden sie nur für die grundlegenden Funktionen GetAll, GetById, Add, Update, Delete und Save Methoden und verwenden Sie es als Basisklasse. Dann müssen Sie bestimmte Repositorys mit speziellen Methoden erstellen, um alle "where" -Klauseln zu behandeln, die ich zuvor als Prädikat übergeben konnte.
Ist das Muster für das generische Repository für andere Zwecke als Entity Framework nützlich? Wenn nicht, warum sollte es jemand verwenden, anstatt direkt mit Entity Framework zu arbeiten?
Der ursprüngliche Link entspricht nicht dem Muster, das ich in meinem Beispielcode verwendet habe. Hier ist ein ( aktualisierter Link ).