it-swarm.com.de

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

Was ist der Unterschied zwischen DAO- (Data Access Objects) und Repository-Mustern? 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.

385
Thurein

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

DAO würde näher an der Datenbank betrachtet, oft tabellenzentriert.
Repository würde näher an der Domain liegen und sich nur mit aggregierten Roots befassen.

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

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

Eine Methode wie Update ist für ein DAO geeignet, jedoch nicht für ein Repository. Bei Verwendung eines Repository werden Änderungen an Entitäten normalerweise von einem separaten UnitOfWork nachverfolgt .

Es scheint üblich zu sein, Implementierungen zu sehen, die als Repository bezeichnet werden und die eigentlich eher als DAO bezeichnet werden, und daher besteht meiner Meinung nach eine gewisse Verwirrung über den Unterschied zwischen ihnen.

408
quentin-starin

OK, ich denke, ich kann besser erklären, was ich in den Kommentaren gesetzt habe :). Grundsätzlich können Sie also beide als gleich ansehen, obwohl DAO ein flexibleres Muster als Repository ist. Wenn Sie beide verwenden möchten, verwenden Sie das Repository in Ihren DAOs. Ich werde jeden von ihnen unten erklären:

REPOSITORY:

Es ist ein Repository für einen bestimmten Objekttyp - es ermöglicht Ihnen, nach einem bestimmten Objekttyp zu suchen und diese zu speichern. Normalerweise behandelt es NUR einen Objekttyp. Z.B. Mit AppleRepository können Sie AppleRepository.findAll(criteria) oder AppleRepository.save(juicyApple) ausführen. Beachten Sie, dass das Repository Domain Model-Begriffe verwendet (keine DB-Begriffe - unabhängig davon, wie Daten an einem beliebigen Ort gespeichert werden).

In einem Repository werden höchstwahrscheinlich alle Daten in derselben Tabelle gespeichert, während das Muster dies nicht erfordert. Die Tatsache, dass nur ein Datentyp verarbeitet wird, stellt eine logische Verbindung zu einer Haupttabelle her (sofern diese für die Datenbankpersistenz verwendet wird).

DAO - Datenzugriffsobjekt (dh Objekt für den Datenzugriff)

Ein DAO ist eine Klasse, die Daten für Sie findet (es handelt sich meistens um einen Finder, wird jedoch häufig zum Speichern der Daten verwendet). Das Muster beschränkt Sie nicht darauf, Daten desselben Typs zu speichern. Sie können also problemlos ein DAO verwenden, das verwandte Objekte findet/speichert.

Z.B. Sie können leicht UserDao haben, die Methoden wie verfügbar macht

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

Alle diese beziehen sich auf Benutzer (und Sicherheit) und können unter demselben DAO angegeben werden. Dies ist beim Repository nicht der Fall.

Endlich

Beachten Sie, dass beide Muster wirklich die gleiche Bedeutung haben (sie speichern Daten und abstrahieren den Zugriff darauf, und sie sind beide näher am Domänenmodell ausgedrückt und enthalten kaum DB-Verweise), aber die Art und Weise, wie sie verwendet werden, kann leicht unterschiedlich sein, wobei DAO eine Rolle spielt etwas flexibler/allgemeiner, während das Repository etwas spezifischer und auf einen bestimmten Typ beschränkt ist.

106
Stef

DAO- und Repository-Muster sind Möglichkeiten zum Implementieren der Datenzugriffsschicht (DAL). Beginnen wir also zuerst 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 nicht über eine bestimmte Implementierung gesprochen: Nur ein allgemeines Prinzip, bei dem die Datenbankzugriffslogik in einem separaten Modul zusammengefasst wird.

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

Das DAO-Muster ist eine Methode zum Generieren von DAL, wobei normalerweise jede Domänenentität über ein eigenes DAO verfügt. Beispiel: User und UserDao, Appointment und AppointmentDao usw. Ein Beispiel für DAO mit Ruhezustand: http: // gochev. blogspot.ca/2009/08/hibernate-generic-dao.html .

Was ist dann das Repository-Muster? Wie DAO ist auch das Repository-Muster ein Weg, um DAL zu erreichen. Der Hauptaspekt des Repository-Musters besteht darin, dass es aus Client-/Benutzer-Sicht wie eine Sammlung aussehen oder sich so verhalten sollte. Mit dem Verhalten einer Sammlung ist nicht gemeint, dass sie wie Collection collection = new SomeCollection() instanziiert werden muss. Stattdessen bedeutet dies, dass Vorgänge wie Hinzufügen, Entfernen, Enthalten usw. unterstützt werden sollen. Dies ist die Essenz des Repository-Musters.

In der Praxis, zum Beispiel bei Verwendung von Ruhezustand, wird das Repository-Muster mit DAO realisiert. Dies ist eine Instanz von DAL. Dies kann sowohl eine Instanz von DAO-Muster als auch ein Repository-Muster sein.

Das Repository-Muster muss nicht unbedingt auf DAO aufbauen (wie manche vielleicht vorschlagen). Wenn DAOs mit einer Schnittstelle entworfen wurden, die die oben genannten Vorgänge unterstützt, handelt es sich um eine Instanz des Repository-Musters. Denken Sie darüber nach: Wenn DAOs bereits eine Sammlung von Operationen bereitstellen, ist dann eine zusätzliche Ebene darüber erforderlich?

74
Nazar Merza

Ehrlich gesagt sieht dies nach einer semantischen Unterscheidung aus, nicht nach einer technischen Unterscheidung. Der Ausdruck "Datenzugriffsobjekt" bezieht sich überhaupt nicht auf eine "Datenbank". Und obwohl Sie es datenbankorientiert gestalten könnten, würden die meisten Leute dies als Konstruktionsfehler betrachten.

Der Zweck des DAO besteht darin, die Implementierungsdetails des Datenzugriffsmechanismus zu verbergen. Wie unterscheidet sich das Repository-Muster? Soweit ich das beurteilen kann, ist es das nicht. Zu sagen, ein Repository ist anders für ein DAO, weil Sie es mit einer Sammlung von Objekten zu tun haben/diese zurückgeben, kann nicht richtig sein. DAOs können auch Sammlungen von Objekten zurückgeben.

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

61
rakehell404

Repository ist ein abstrakterer domänenorientierter Begriff, der Teil von Domain Driven Design ist. Es ist Teil Ihres Domain-Designs und eine gemeinsame Sprache. DAO ist eine technische Abstraktion für Datenzugriffstechnologie. Das Repository befasst sich nur mit der Verwaltung vorhandener Daten und Fabriken für die Erstellung von Daten.

überprü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

16
Mohamed Abed

Der Hauptunterschied besteht darin, dass ein Repository den Zugriff auf die Aggregatwurzeln in einem Aggregat verwaltet, während DAO den Zugriff auf Entitäten verwaltet. Daher delegiert ein Repository in der Regel die tatsächliche Persistenz der Aggregatwurzeln an ein DAO. Da der Gesamtstamm außerdem den Zugriff der anderen Entitäten verwalten muss, muss er diesen Zugriff möglicherweise an andere DAOs delegieren.

6
pablochacin

Repository sind nichts anderes als gut gestaltete DAO.

ORM ist tabellenzentriert, aber nicht DAO.

Es ist nicht erforderlich, mehrere DAOs im Repository zu verwenden, da DAO selbst mit ORM-Repositorys/-Entitäten oder anderen DAL-Anbietern genau dasselbe tun kann, unabhängig davon, wo und wie ein Auto beständig ist. 1 Tisch, 2 Tabellen, n Tabellen, eine halbe Tabelle, a Webservice, eine Tabelle und ein Webservice usw. Services verwenden mehrere DAO/Repositorys.

Mein eigener DAO, sagen wir, CarDao befasst sich nur mit Car DTO. Ich meine, nehme nur Car DTO als Eingabe und gebe nur Car DTO oder Car DTO-Sammlungen als Ausgabe zurück.

DAO ist also genau wie Repository eine IoC für die Geschäftslogik, sodass Persistenzschnittstellen nicht durch Persistenzstrategien oder Legate eingeschüchtert werden können. DAO kapselt sowohl die Persistenzstrategie als auch die domänenbezogene Persistenzschnittstelle. Repository ist nur ein weiteres Wort für diejenigen, die nicht verstanden haben, was eine genau definierte DAO-Aktualität ist.

3
Cyril

Versuchen Sie herauszufinden, ob DAO oder das Repository-Muster für die folgende Situation am besten geeignet sind: Stellen Sie sich vor, Sie möchten eine einheitliche Datenzugriffs-API für einen dauerhaften Mechanismus für verschiedene Arten von Datenquellen wie RDBMS, LDAP, OODB, XML-Repositorys und bereitstellen flache dateien.

Beachten Sie bei Interesse auch die folgenden Links:

http://www.codeinsanity.com/2008/08/repository-pattern.html

http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/

http://devlicio.us/blogs/casey/archive/2009/02/20/ddd-the-repository-pattern.aspx

http://en.wikipedia.org/wiki/Domain-driven_design

http://msdn.Microsoft.com/en-us/magazine/dd419654.aspx

2
javaDisciple

DAO bietet Abstraktion für Datenbank-/Datendateien oder andere Persistenzmechanismen, sodass die Persistenzschicht manipuliert werden kann, ohne die Implementierungsdetails zu kennen.

Während in Repository-Klassen mehrere DAO-Klassen in einer einzelnen Repository-Methode verwendet werden können, um einen Vorgang aus Sicht der App durchzuführen. Verwenden Sie Repository, anstatt mehrere DAOs auf Domänenebene zu verwenden. Das Repository ist eine Schicht, die möglicherweise eine Anwendungslogik enthält: Wenn Daten im speicherinternen Cache verfügbar sind, holen Sie sie andernfalls aus dem Cache, holen Sie Daten aus dem Netzwerk und speichern Sie es für den nächsten Abruf im In-Memory-Cache.

2
Rahul Rastogi

in einem sehr einfachen Satz: Der wesentliche Unterschied besteht darin, dass Repositorys Sammlungen darstellen, während DAOs näher an der Datenbank liegen und häufig weitaus tabellenzentrierter sind.