Ich habe kürzlich viele Argumente gegen die Verwendung des Repository-Musters mit leistungsstarken ORMs wie Entity Framework gelesen, da es neben der Unit of Work-Funktionalität auch Repository-ähnliche Funktionen enthält.
Ein weiteres Argument gegen die Verwendung des Musters für eine Situation wie Unit-Tests ist, dass das Repository-Muster eine undichte Abstraktion ist, da die allgemeineren Implementierungen IQueryable nutzen.
Die Argumente gegen die Verwendung des Repository-Musters sind für mich sinnvoll, aber die vorgeschlagenen alternativen Methoden für Abstraktionen sind oft verwirrender und erscheinen genauso übertrieben wie das Problem.
Die Lösung von Jimmy Bogards scheint eine Mischung aus dem Wegblasen der Abstraktionen, aber auch der Einführung seiner eigenen Architektur zu sein. https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Ein weiteres Beispiel dafür, dass Repositorys unnötig sind ... aber benutze meine Architektur! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/
Ein weiteres ... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework
Ich habe keinen eindeutigen Ersatz oder eine Alternative zum "übermäßig komplexen" Repository-Muster-Ansatz gefunden, der selbst nicht mehr architektonisch ist.
quelle
Antworten:
Ich denke, Sie verschmelzen Repositories und generische Repositories.
Ein Basis-Repository verbindet lediglich Ihren Datenspeicher und bietet Methoden zum Zurückgeben der Daten
Die Datenschicht wird nicht über IQueryable oder andere Methoden zur Übergabe zufälliger Abfragen in Ihren Code übertragen und bietet eine genau definierte testbare und injizierbare Oberfläche von Methoden.
Mit einem generischen Repository können Sie Ihre Abfrage ähnlich wie mit einem ORM übergeben
Ich bin damit einverstanden, dass es nicht viel Sinn macht, ein generisches Repository über einem ORM zu verwenden, das im Grunde nur ein anderes generisches Repository ist.
Die Antwort besteht darin, das grundlegende Repository-Muster zu verwenden, um Ihr ORM auszublenden
quelle
Die meisten der Argumente, die Sie erwähnen, werden fälschlicherweise den nicht vorhandenen Repository-Musterfunktionen zugeordnet.
Konzeptionell ist ein Repository, wie es ursprünglich in DDD definiert wurde, nur eine Sammlung von Objekten, die Sie suchen oder hinzufügen können. Der dahinter stehende Persistenzmechanismus wird abstrahiert, sodass Sie als Verbraucher die Illusion bekommen, dass es sich um eine In-Memory-Sammlung handelt.
Eine Repository-Implementierung mit undichten Abstraktionen (
IQueryables
z. B. Offenlegung ) ist eine schlechte Repository-Implementierung.Eine Repository-Implementierung, die mehr als nur Erfassungsvorgänge (z. B. Unit of Work-Funktionen) verfügbar macht, ist eine schlechte Repository-Implementierung.
Gibt es Alternativen zum Repository für den Datenzugriff? Ja, aber sie beziehen sich nicht auf die Themen, die Sie in Ihrer Frage ansprechen.
quelle
Für mich haben Repositorys in Kombination mit ORM oder anderen DB-Persistenzschichten folgende Nachteile:
Sowie:
4. Objekt "Gefahr Gottes": Sie könnten versucht sein, eine Gottklasse zu erstellen, die Ihr gesamtes Modell oder Ihre Datenzugriffsebene abdeckt. Die Repository-Klasse würde nicht nur Car-Methoden enthalten, sondern Methoden für alle Entitäten.
Meiner Meinung nach ist es besser, zumindest einige Abfragemöglichkeiten anzubieten, um das große Durcheinander vieler Einzweckmethoden zu vermeiden. Egal, ob es sich um LINQ, eine eigene Abfragesprache oder etwas handelt, das direkt aus dem ORM stammt (OK, Art des Kopplungsproblems ...).
quelle
Wenn der Zweck der Repository-Schnittstelle darin besteht, die Datenbank für einen unittest (= Test isoliert) zu verspotten, ist die beste Abstraktion etwas, das leicht zu verspotten ist.
Es ist schwierig, eine Repository-Schnittstelle zu verspotten, die auf einem IQueryable-Ergebnis basiert.
Aus Sicht der Unit-Tests
kann leicht verspottet werden
kann nur dann leicht verspottet werden, wenn der Verspottung den Inhalt des Abfrageparameters ignoriert.
kann nicht leicht verspottet werden
quelle
Ich denke nicht, dass das Repository-Muster übertrieben ist, wenn Sie Lambda-Funktionen zum Abfragen verwenden. Besonders wenn Sie das ORM abstrahieren müssen (meiner Meinung nach sollten Sie es immer tun), sind mir die Implementierungsdetails des Repositorys selbst egal.
Beispielsweise:
quelle