Repository-Muster Schritt für Schritt Erläuterung [geschlossen]

276

Kann mir bitte jemand das Repository-Muster in .NET erklären, Schritt für Schritt mit einem sehr einfachen Beispiel oder einer Demo.

Ich weiß, dass dies eine sehr häufige Frage ist, aber bisher habe ich keine zufriedenstellende Antwort gefunden.

Sa Patil
quelle

Antworten:

199

Zusammenfassend würde ich die umfassenderen Auswirkungen des Repository-Musters beschreiben. Es ermöglicht Ihrem gesamten Code, Objekte zu verwenden, ohne wissen zu müssen, wie die Objekte beibehalten werden. Das gesamte Wissen über die Persistenz, einschließlich der Zuordnung von Tabellen zu Objekten, ist sicher im Repository enthalten.

Sehr oft finden Sie SQL-Abfragen in der Codebasis verstreut. Wenn Sie einer Tabelle eine Spalte hinzufügen, müssen Sie nach Codedateien suchen, um die Verwendung einer Tabelle zu finden. Die Auswirkungen der Änderung sind weitreichend.

Mit dem Repository-Muster müssten Sie nur ein Objekt und ein Repository ändern. Die Auswirkungen sind sehr gering.

Vielleicht hilft es, darüber nachzudenken, warum Sie das Repository-Muster verwenden würden. Hier sind einige Gründe:

  • Sie haben nur einen Ort, an dem Sie Änderungen an Ihrem Datenzugriff vornehmen können

  • Sie haben einen einzigen Ort, der (normalerweise) für eine Reihe von Tabellen verantwortlich ist.

  • Es ist einfach, ein Repository durch eine gefälschte Implementierung zum Testen zu ersetzen. Sie benötigen also keine Datenbank für Ihre Komponententests

Es gibt auch andere Vorteile, zum Beispiel, wenn Sie MySQL verwenden und zu SQL Server wechseln möchten - aber ich habe dies in der Praxis noch nie gesehen!

Fenton
quelle
28
Wenn ich von dbms a nach b wechsle, werde ich aufzeichnen, dass ich dies nicht nur gesehen habe, sondern dies auch im Produktionscode getan habe. Wir hatten zuvor Oracle verwendet, mussten den Hosting-Anbieter wechseln und uns für Azure entscheiden (bevor Oracle unterstützt wurde), sodass wir auf SQL Azure konvertieren mussten. Leider hatten wir zu diesem Zeitpunkt noch nicht die gesamte Datenzugriffslogik getrennt, aber wir haben es sicherlich getan, als wir diese Migration durchgeführt haben (und in Zukunft könnte ich hinzufügen).
Joe
5
Ich weiß, dass dieser Kommentar alt und als Off-Topic geschlossen ist, aber ich habe dies in mehreren Unternehmen gesehen. In der Regel ist es Teil eines Prozesses, sich auf ein ORM zu oder von diesem weg zu bewegen. Das Repository erleichtert das Auswechseln, insbesondere wenn Sie sie aus einem abstrakten Factory-Muster laden oder einen IoC-Container verwenden.
Derek Van Cuyk
Tatsächlich verwendet das Repository DAO für seine Datenquellenoperationen ...
Yousha Aleayoub
1
@ YoushaAleayoub, dass ein guter Punkt, den Sie ansprechen. In der Regel finden Sie Datenzugriffsobjekte, wenn Benutzer versuchen, "die Datenbank zu trennen", und Repositorys, wenn Benutzer versuchen, "eine einzelne Sache für die Abfrage verantwortlich zu machen". In fast allen Fällen finden Sie beide zusammen. Das DAO Teil ist der IConnection, ICommandusw Teil, versteckt die Art der Datenbank. Das Repository ist normalerweise domänenzentrierter.
Fenton
181

Dies ist ein schönes Beispiel: Das Repository-Musterbeispiel in C #

Grundsätzlich verbirgt das Repository die Details darüber, wie genau die Daten aus / in die Datenbank abgerufen / beibehalten werden. Unter der Decke:

  • Zum Lesen wird die Abfrage erstellt, die die angegebenen Kriterien erfüllt, und die Ergebnismenge zurückgegeben
  • Zum Schreiben werden die Befehle ausgegeben, die erforderlich sind, damit die zugrunde liegende Persistenz-Engine (z. B. eine SQL-Datenbank) die Daten speichert
zwei Blumen
quelle
13
Dieses Beispiel ist die beste Erklärung aller Zeiten, einfach besser als die MSDN-Dokumentation.
Teoman Shipahi
2
Ich fand das sehr gut. Es bietet auch eine anständige Erklärung zu Unit of Work, die eine allgemeinere Form des
Datenmusters
8
Das verknüpfte Beispiel ist ein Repository-Musterfehler. Es bietet überhaupt keinen Vorteil gegenüber der direkten Verwendung der von Entity Framework ( IDbContext) oder in nhibernate ( ISession) bereitgestellten Schnittstellen . Ein korrekt implementiertes Repository abstrahiert ALLE persistenzspezifischen Informationen (wie die Funktionsweise des aktuellen Linq To Sql-Anbieters). dh niemals aussetzen IQueryable.
Jgauffin
3
@jgauffin IQueryableist keine persistenzspezifische Information. Die Sicherung des IQueryable kann so einfach wie ein fest codiertes Array sein oder aus einer XML-Datei, einem Webdienst, einer Datenbank, einer Flatfile usw. stammen. Ich würde kein Repository empfehlen, das IQueryable nicht wie immer verfügbar macht Dies führt in jedem Fall zu einem langsamen Datenzugriff, bei dem durch das Offenlegen von IQueryable einige Instanzen gegebenenfalls Leistungsverbesserungen vornehmen können, wenn der Persistenzspeicher über diese Funktion verfügt. Wenn Sie DbContext verstecken, können Sie bei Bedarf zu einem anderen ORM wechseln (oder zu keinem ORM!)
Robert McKee,
5
Es gibt persistenzinformationsspezifische Informationen. Versuchen Sie, eifrig / faul zu laden oder eine INSQL-Klausel zu erstellen, ohne zu wissen, wie der jeweilige LinqToSql-Anbieter dies tut.
Jgauffin