Ich habe viel über das Repository-Muster gehört, aber ich habe nicht verstanden, was ein Repository wirklich tun sollte. Wenn ich sage "Was ein Repository wirklich tun sollte", mache ich mir hauptsächlich Gedanken darüber, welche Methoden es bereitstellen sollte. Soll ein Repository beispielsweise wirklich CRUD-Methoden oder eine andere Methode bereitstellen?
Ich meine, sollten die Repositorys Geschäftslogik enthalten, oder sollten sie einfach die Logik enthalten, um mit dem Datenspeicher zu kommunizieren und die zu speichernden oder zu ladenden Entitäten zu verwalten?
Ich habe auch gehört, dass Repositorys Persistenz-Einheiten für Aggregate sind. Aber wie ist das Ich verstehe nicht, wie das in der Praxis funktioniert. Ich dachte, wir sollten nur eine Schnittstelle haben, IRepository
die die CRUD-Methoden enthält, und dann würde die Implementierung für jede Entität einfach die Logik zum Speichern und Abrufen eines solchen Typs aus dem Datenspeicher enthalten.
quelle
Antworten:
Nun, Sie können ein gutes Beispiel in der sehen Spring Data Framework sehen, das auf dem Konzept von Repositorys basiert.
Dort sehen Sie, dass Repositorys nur den Datenspeicher behandeln und selten Geschäftslogik enthalten (diese ist für die Service-Schicht reserviert). Wenn Sie sich zum Beispiel das Design ansehen, werden Sie feststellen, dass sie eine CRUDRepository- Schnittstelle haben, die Methoden zum Erstellen, Zerstören und Wiederherstellen von Entitäten (unter anderem) bereitstellt. Es gibt auch ein PagingAndSortingRepository , das zusätzliche Funktionen für genau das, Sortieren und Paging-Ergebnisse usw. usw. hinzufügt.
Dieses Framework ist vielleicht ein guter Ort, um ein gutes Repository-Design zu studieren.
Soweit mir bekannt ist, stammen viele der vom Spring Data Framework implementierten Konzepte aus einem großartigen Buch mit dem Titel Domain-Driven Design: Komplexität im Herzen von Software bewältigen . Das Buch enthält einen vollständigen Abschnitt zum Repository-Design.
Sie können eine Kopie davon erhalten.
Ein kleiner Auszug aus dem Buch erklärt:
quelle
Es sollte weder eine direkte CRUD-Schnittstelle noch Geschäftslogik bieten. Es vermittelt zwischen Geschäftslogik und Datenbank. Die Schnittstelle sollte in Geschäftslogik ausgedrückt sein, aber keine Geschäftslogik selbst ausführen, eher wie ein Geschäftslogikgrundelement. Angenommen, Sie möchten ein E-Mail-System erstellen, Sie haben Benutzer und Nachrichten. Ihr Repository würde grundlegende CRUD-Operationen für Benutzer und Nachrichten bereitstellen, aber es würde auch gefilterte Ansichten von Nachrichten wie GetUsersNewMessages (Benutzer) oder GetSearchedMessages (Benutzer, searchTerms) bereitstellen.
Die Idee ist, dass das Repository verbirgt, wie Speicher implementiert wird, und eine saubere Schnittstelle bereitstellt, die einen schnellen und flexiblen Zugriff auf die Daten ermöglicht. Wenn Sie die Abläufe auf einem hohen Niveau halten, was passieren soll und nicht, bedeutet dies, dass Sie mehr Flexibilität haben, um sie auf die für den zugrunde liegenden Hintergrundspeicher beste Weise zu implementieren.
quelle