webentwicklung-frage-antwort-db.com.de

Generisches Repository Mit EF 4.1, worum es geht

Während ich mich näher mit DbContext, DbSet und den zugehörigen Schnittstellen befasse, frage ich mich, warum Sie ein separates "generisches" Repository um diese Implementierungen herum implementieren müssten.

Es sieht so aus, als ob DbContext und IDbSet alles tun, was Sie brauchen, und die "Arbeitseinheit" in DbContext einfügen.

Vermisse ich hier etwas oder scheinen die Leute es zu genießen, ohne Grund eine weitere Abhängigkeitsebene hinzuzufügen?.

145
Code Jammr

Sie haben tatsächlich recht. DbContext ist eine Implementierung des Musters für Arbeitseinheiten und IDbSet ist eine Implementierung des Repository-Musters.

Repositories sind derzeit sehr beliebt und überlastet. Jeder verwendet sie, nur weil es Dutzende von Artikeln über das Erstellen eines Repositorys für ein Entity-Framework gibt, aber niemand beschreibt tatsächlich Herausforderungen im Zusammenhang mit dieser Entscheidung.

Hauptgründe für die Verwendung von Repository sind normalerweise:

  • Verstecke EF von der oberen Ebene
  • Machen Sie Code besser testbar

Der erste Grund ist eine architektonische Reinheit und die großartige Idee, dass Sie später zu einem anderen Persistenz-Framework wechseln können, wenn Sie Ihre oberen Ebenen von EF unabhängig machen. Wie oft hast du so etwas in der realen Welt gesehen? Dieser Grund erschwert die Arbeit mit EF erheblich, da in Ihrem Repository viele zusätzliche Funktionen zur Verfügung stehen müssen, die die von EF standardmäßig zulässigen Funktionen umschließen.

Durch das Umschließen von EF-Code wird der Code gleichzeitig übersichtlicher und folgt den Regeln zur Trennung von Anliegen. Für mich kann dies der einzige wirkliche Vorteil von Repository und Arbeitseinheit sein, aber Sie müssen verstehen, dass das Befolgen dieser Regel mit EF Ihren Code möglicherweise besser pflegbar und lesbarer macht Für kleinere Anwendungen kann dies zu unnötiger Komplexität führen.

Der zweite Grund ist teilweise richtig. Der große Nachteil von EF ist die starre Architektur, die kaum verspottet werden kann. Wenn Sie also die obere Ebene eines Komponententests testen möchten, müssen Sie EF irgendwie umbrechen, damit die Implementierung verspottet werden kann. Aber das hat viele andere Konsequenzen, die ich beschrieben habe hier .

Ich folge Ayendes Blog . Wenn Sie jemals NHibernate verwendet haben, kennen Sie wahrscheinlich seine Artikel. Dieser Typ hat kürzlich mehrere Artikel gegen die Verwendung von Repository mit NHibernate geschrieben, aber NHibernate ist viel besser spottbar.

202
Ladislav Mrnka

Ich habe mit denselben Problemen zu kämpfen, und die Verspottbarkeit beim Testen der EF-Ebenen ist wichtig. Aber ich bin auf diesen großartigen Artikel gestoßen, in dem erklärt wird, wie der EF 4.1-DbContext spottbar gemacht wird, indem sichergestellt wird, dass der abgeleitete DbContext eine generische Schnittstelle implementiert und IDbSet anstelle von DbSet verfügbar macht. Da ich einen Database First-Ansatz verwende, weil unsere Datenbank bereits vorhanden ist, habe ich einfach die T4-Vorlagen geändert, die zum Generieren meines abgeleiteten DbContext verwendet wurden, um IDbSet-Schnittstellen zurückzugeben, und von meiner generischen Schnittstelle abgeleitet. Auf diese Weise kann die gesamte Sache leicht verspottet werden, und Sie müssen kein eigenes Unit Of Work- oder Repository-Muster implementieren. Schreiben Sie einfach Ihren Servicecode, um Ihre generische Schnittstelle zu konsumieren, und wenn Sie zum Komponententest gehen, verspotten Sie einfach die generische Schnittstelle mit spezifischen Testdaten, und Sie können loslegen.

http://refactorthis.wordpress.com/2011/05/31/mock-faking-dbcontext-in-entity-framework-4-1-with-a-generic-repository/

21
Kendall Bennett

Ein Grund für das Erstellen des Repositorys besteht darin, dass Sie die Implementierung von DBSet und DbContext ausblenden können, wenn Sie von EntityFramework zu einem anderen Objekt wechseln oder umgekehrt.

Ich habe beispielsweise NHibernate verwendet und alle Aufrufe dieses Frameworks in meine Repository-Klassen eingeschlossen. Sie geben IEnumerable zurück, damit sie "generisch" sind, und meine Repositorys verfügen über die Standard-CRUD-Operationen (Aktualisieren, Löschen usw.). Ich bin längst zu Entity Framework gewechselt. Dabei musste ich nichts in meinen ViewModel-Klassen oder darüber hinaus ändern, da sie auf mein Repository verweisen. Ich musste nur das Innere meines Repositorys ändern. Dies erleichterte die Migration erheblich.

(Ich habe NHibernate verwendet, weil wir eine Verbindung zu den ISeries herstellen. Zu diesem Zeitpunkt gab es keine kostenwirksamen Implementierungen, bei denen EF mit den ISeries verwendet wurde. Die einzige Möglichkeit bestand darin, IBM für DB2Connect 12.000 US-Dollar zu zahlen.)

5
user134363