574 Stimmen

Was ist der Unterschied zwischen DAO- und Repository-Mustern?

Was ist der Unterschied zwischen Data Access Objects (DAO) und Repository Patterns? Ich entwickle eine Anwendung mit Enterprise Java Beans (EJB3), Hibernate ORM als Infrastruktur und Domain-Driven Design (DDD) und Test-Driven Development (TDD) als Entwurfstechniken.

654voto

quentin-starin Punkte 25165

DAO ist eine Abstraktion von Datenpersistenz .
Repository ist eine Abstraktion von eine Sammlung von Objekten .

DAO würde als näher an der Datenbank liegend betrachtet werden, oft tabellenorientiert.
Repository würde als dem Bereich näher stehend betrachtet werden, da es sich nur um Aggregatwurzeln handelt.

Repository könnte implementiert werden mit DAO Sie würden aber auch nicht das Gegenteil tun.

Auch ein Repository ist im Allgemeinen eine engere Schnittstelle. Sie sollte einfach eine Sammlung von Objekten sein, mit einer Get(id) , Find(ISpecification) , Add(Entity) .

Eine Methode wie Update ist geeignet für eine DAO , aber nicht ein Repository - bei Verwendung eines Repository Änderungen an Entitäten werden in der Regel durch separate UnitOfWork verfolgt.

Es scheint üblich zu sein, Implementierungen mit der Bezeichnung a Repository das ist eigentlich eher ein DAO und daher glaube ich, dass der Unterschied zwischen ihnen etwas verwirrend ist.

154voto

Stef Punkte 2463

OK, ich denke, ich kann besser erklären, was ich in den Kommentaren geschrieben habe :). Also, im Grunde können Sie beide als das gleiche sehen, obwohl DAO ein flexibleres Muster als Repository ist. Wenn Sie beide verwenden wollen, würden Sie das Repository in Ihren DAOs verwenden. Ich erkläre jedes dieser Muster weiter unten:

REPOSITORY:

Es ist ein Repository für eine bestimmte Art von Objekten - es ermöglicht Ihnen die Suche nach einer bestimmten Art von Objekten sowie deren Speicherung. Normalerweise wird NUR eine bestimmte Art von Objekten verwaltet. Z.B.. AppleRepository würde es Ihnen ermöglichen AppleRepository.findAll(criteria) ou AppleRepository.save(juicyApple) . Beachten Sie, dass das Repository Begriffe aus dem Domänenmodell verwendet (keine DB-Begriffe - nichts, was damit zu tun hat, wie Daten irgendwo persistiert werden).

In einem Repository werden höchstwahrscheinlich alle Daten in derselben Tabelle gespeichert, während das Muster dies nicht erfordert. Die Tatsache, dass es nur eine Art von Daten verarbeitet, macht es logisch mit einer Haupttabelle verbunden (wenn es für DB-Persistenz verwendet wird).

DAO - Datenzugriffsobjekt (mit anderen Worten: Objekt für den Zugriff auf Daten)

Ein DAO ist eine Klasse, die Daten für Sie sucht (meist ist es ein Finder, aber es wird häufig auch zum Speichern der Daten verwendet). Das Muster schränkt Sie nicht auf die Speicherung von Daten desselben Typs ein, so dass Sie leicht ein DAO haben können, das verwandte Objekte findet/speichert.

Sie können z.B. einfach ein UserDao haben, das Methoden bereitstellt wie

Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)

Alle diese sind mit dem Benutzer (und der Sicherheit) verbunden und können unter derselben DAO angegeben werden. Dies ist bei Repository nicht der Fall.

Endlich

Beachten Sie, dass beide Muster eigentlich dasselbe bedeuten (sie speichern Daten und abstrahieren den Zugriff darauf, und beide sind näher am Domänenmodell ausgedrückt und enthalten kaum DB-Referenzen), aber die Art und Weise, wie sie verwendet werden, kann leicht unterschiedlich sein, wobei DAO etwas flexibler/generischer ist, während Repository etwas spezifischer und nur auf einen Typ beschränkt ist.

134voto

Nazar Merza Punkte 3145

DAO und Repository-Muster sind Möglichkeiten zur Implementierung der Datenzugriffsschicht (DAL). Beginnen wir also zunächst mit DAL.

Objektorientierte Anwendungen, die auf eine Datenbank zugreifen, müssen über eine Logik für den Datenbankzugriff verfügen. Um den Code sauber und modular zu halten, wird empfohlen, die Datenbankzugriffslogik in einem separaten Modul zu isolieren. In der Schichtenarchitektur ist dieses Modul DAL.

Bisher haben wir noch nicht über eine bestimmte Implementierung gesprochen, sondern nur über den allgemeinen Grundsatz, die Datenbankzugriffslogik in ein separates Modul zu packen.

Wie können wir dieses Prinzip nun umsetzen? Nun, ein bekannter Weg, dies zu implementieren, insbesondere mit Frameworks wie Hibernate, ist das DAO-Muster.

Das DAO-Muster ist eine Art der DAL-Generierung, bei der typischerweise jede Domäneneinheit ihre eigene DAO hat. Zum Beispiel, User et UserDao , Appointment et AppointmentDao , usw. Ein Beispiel für DAO mit Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html .

Was ist dann ein Repository-Muster? Wie DAO ist auch das Repository-Muster eine Möglichkeit, DAL zu erreichen. Der wichtigste Punkt im Repository-Muster ist, dass es aus der Sicht des Kunden/Benutzers wie eine Sammlung aussehen oder sich wie eine solche verhalten sollte. Mit dem Verhalten wie eine Sammlung ist nicht gemeint, dass es wie eine Sammlung instanziiert werden muss. Collection collection = new SomeCollection() . Stattdessen bedeutet es, dass es Operationen wie Hinzufügen, Entfernen, Enthalten usw. unterstützen sollte. Dies ist das Wesen des Repository-Musters.

In der Praxis, zum Beispiel bei der Verwendung von Hibernate, wird das Repository-Muster mit DAO realisiert. Das heißt, eine Instanz von DAL kann gleichzeitig eine Instanz von DAO-Muster und Repository-Muster sein.

Das Repository-Muster ist nicht notwendigerweise etwas, das man auf DAO aufbaut (wie manche vielleicht meinen). Wenn DAOs mit einer Schnittstelle entworfen werden, die die oben genannten Operationen unterstützt, dann ist es eine Instanz des Repository-Musters. Denken Sie darüber nach: Wenn DAOs bereits einen sammlungsähnlichen Satz von Operationen bieten, wozu dann noch eine zusätzliche Schicht?

121voto

rakehell404 Punkte 1129

Offen gesagt, scheint dies eine semantische und keine technische Unterscheidung zu sein. Der Ausdruck Data Access Object bezieht sich nicht auf eine "Datenbank". Und obwohl man es datenbankzentriert gestalten könnte, würden die meisten Leute dies wohl als Designfehler betrachten.

Der Zweck der DAO besteht darin, die Implementierungsdetails des Datenzugriffsmechanismus zu verbergen. Was ist der Unterschied zum Repository-Muster? Soweit ich das beurteilen kann, ist es das nicht. Wenn man sagt, dass ein Repository verschiedene zu einem DAO, weil man mit einer Sammlung von Objekten zu tun hat/eine Sammlung von Objekten zurückgibt, kann nicht richtig sein; DAOs können auch Sammlungen von Objekten zurückgeben.

Alles, was ich über das Repository-Muster gelesen habe, scheint sich auf diese Unterscheidung zu stützen: schlechtes DAO-Design vs. gutes DAO-Design (auch bekannt als Repository-Design-Muster).

20voto

Mohamed Abed Punkte 4847

Repository ist ein eher abstrakter, domänenorientierter Begriff, der Teil des Domain Driven Design ist, es ist Teil Ihres Domänendesigns und eine gemeinsame Sprache, DAO ist eine technische Abstraktion für Datenzugriffstechnologie, Repository befasst sich nur mit der Verwaltung bestehender Daten und Fabriken für die Erstellung von Daten.

prüfen Sie diese Links:

http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X