Jaka jest różnica między wzorcami DAO i repozytorium?

Czym różni się Data Access Objects (DAO) od wzorców repozytoriów? Rozwijam aplikację wykorzystującą Enterprise Java Beans (EJB3), Hibernate ORM jako infrastrukturę oraz Domain-Driven Design (DDD) i Test-Driven Development (TDD) jako techniki projektowania.

Author: TylerH, 2011-12-18

12 answers

DAO jest abstrakcją trwałości danych .
Repository jest abstrakcją zbioru obiektów .

DAO byłby uważany za bliższy bazie danych, często zorientowany na tabelę.
Repository byłby uważany za bliższy domenie, zajmującej się tylko zagregowanymi korzeniami.

Repository może być zaimplementowany przy użyciu DAO's, ale nie zrobiłbyś czegoś odwrotnego.

Również {[1] } jest ogólnie węższym interfejsem. Powinien to być po prostu zbiór przedmioty, z Get(id), Find(ISpecification), Add(Entity).

Metoda taka jak {[10] } jest odpowiednia dla DAO, ale nie dla Repository - gdy używasz Repository, zmiany w encjach będą Zwykle śledzone przez oddzielną UnitOfWork.

Wydaje się, że często widzi się implementacje zwane Repository, które są naprawdę bardziej DAO, i dlatego myślę, że jest pewne zamieszanie co do różnicy między nimi.

 527
Author: quentin-starin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-26 10:01:25

OK, chyba lepiej wytłumaczę to co umieściłem w komentarzach :). Więc, zasadniczo, można zobaczyć oba te jako takie same, choć DAO jest bardziej elastyczny wzór niż repozytorium. Jeśli chcesz użyć obu, możesz użyć repozytorium w swoich DAO-s. wyjaśnię każdy z nich poniżej:

Repozytorium:

Jest to repozytorium określonego typu obiektów-umożliwia wyszukiwanie określonego typu obiektów oraz ich przechowywanie. Zazwyczaj obsługuje tylko jeden typ obiektów. Np. AppleRepository pozwoli Ci to zrobić AppleRepository.findAll(criteria) lub AppleRepository.save(juicyApple). Zauważ, że repozytorium używa warunków modelu domeny (Nie warunków DB - nic związanego z tym, jak dane są przechowywane w dowolnym miejscu).

Repozytorium najprawdopodobniej będzie przechowywać wszystkie dane w tej samej tabeli, podczas gdy wzorzec tego nie wymaga. Fakt, że obsługuje tylko jeden typ danych, sprawia, że jest logicznie połączony z jedną tabelą główną (jeśli jest używana dla DB persistence).

DAO-data access object (innymi słowy-obiekt służący do dostępu data)

DAO jest klasą, która lokalizuje dane dla Ciebie (jest to głównie finder, ale jest powszechnie używany do przechowywania danych). Wzorzec nie ogranicza do przechowywania danych tego samego typu, więc możesz łatwo mieć DAO, które lokalizuje / przechowuje powiązane obiekty.

Np. można łatwo mieć UserDao, które eksponuje metody jak

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

Wszystkie te są związane z użytkownikiem (i bezpieczeństwem) i mogą być określone w tym samym DAO. Tak nie jest w przypadku Repozytorium.

Wreszcie

Zauważ, że oba wzorce naprawdę znaczą to samo (przechowują Dane i abstrakują dostęp do nich i oba są wyrażone bliżej modelu domeny i prawie nie zawierają żadnego odniesienia do DB), ale sposób ich użycia może być nieco inny, DAO jest nieco bardziej elastyczny/ogólny, podczas gdy repozytorium jest nieco bardziej specyficzne i ograniczające tylko do typu.

 132
Author: Stef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

DAO i wzorzec repozytorium są sposobami implementacji warstwy dostępu do danych (DAL). Zacznijmy od dala.

Aplikacje obiektowe, które uzyskują dostęp do bazy danych, muszą mieć pewną logikę, aby obsługiwać dostęp do bazy danych. Aby Kod był czysty i modularny, zaleca się wyodrębnienie logiki dostępu do bazy danych w osobny moduł. W architekturze warstwowej moduł ten to DAL.

Do tej pory nie mówiliśmy o żadnej konkretnej implementacji: tylko o ogólnym zasada, że umieszczenie logiki dostępu do bazy danych w osobnym module.

Jak możemy wdrożyć tę zasadę? Cóż, jednym ze znanych sposobów implementacji tego, w szczególności z frameworkami takimi jak Hibernate, jest wzorzec DAO.

Wzór DAO jest sposobem generowania DAL, gdzie zazwyczaj każda jednostka domeny ma swoje własne DAO. Na przykład User i UserDao, Appointment i AppointmentDao, itd. Przykład DAO z Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html .

Więc czym jest wzór repozytorium? Podobnie jak DAO, wzór repozytorium jest również sposobem osiągnięcia DAL. Głównym punktem wzorca repozytorium jest to, że z perspektywy klient/Użytkownik powinien wyglądać lub zachowywać się jak kolekcja. Zachowywanie się jak zbiór nie oznacza, że musi być utworzony jak Collection collection = new SomeCollection(). Zamiast tego oznacza to, że powinien obsługiwać operacje takie jak dodawanie, usuwanie, zawiera itp. To jest esencja wzorca repozytorium.

W praktyce, na przykład w przypadku użycia Hibernate, wzór repozytorium jest realizowany za pomocą DAO. To jest instancja DAL może być jednocześnie instancją Dao pattern i repozytorium pattern.

Wzór repozytorium niekoniecznie jest czymś, co buduje się na DAO (jak niektórzy mogą sugerować). Jeśli Dao są zaprojektowane z interfejsem obsługującym wyżej wymienione operacje, to jest to instancja wzorca repozytorium. Pomyśl o to, jeśli DAOs już zapewniają zbiór-jak zestaw operacji, to co jest potrzebne do dodatkowej warstwy na nim?

 103
Author: Nazar Merza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-21 07:54:49

Szczerze mówiąc, wygląda to na rozróżnienie semantyczne, a nie TECHNICZNE. Obiekt phrase Data Access w ogóle nie odnosi się do "bazy danych". I chociaż mógłbyś zaprojektować go tak, aby był skoncentrowany na bazie danych, myślę, że większość ludzi rozważyłaby to jako wadę projektową.

Celem DAO jest ukrycie szczegółów implementacji mechanizmu dostępu do danych. Czym różni się wzór repozytorium? Z tego co wiem, to nie jest. mówiąc, że repozytorium jest inne do DAO ponieważ masz do czynienia z/return zbiór obiektów nie może być prawda; DAOs może również zwrócić kolekcje obiektów.

Wszystko, co czytałem o wzorze repozytorium wydaje się polegać na tym rozróżnieniu: bad DAO design vs good DAO design (aka repository design pattern).

 87
Author: rakehell404,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 11:13:41

Repozytorium jest bardziej abstrakcyjny domain oriented termin, który jest częścią Domain Driven Design, jest częścią projektu domeny i wspólnego języka, DAO jest abstrakcją techniczną dla technologii dostępu do danych, repozytorium dotyczy tylko zarządzania istniejącymi danymi i fabryk do tworzenia danych.

Sprawdź te linki:

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

 17
Author: Mohamed Abed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-24 16:03:22

Zasadnicza różnica polega na tym, że repozytorium obsługuje dostęp do zagregowanych korzeni w agregacie an, podczas gdy DAO obsługuje dostęp do encji. Dlatego często repozytorium deleguje rzeczywistą trwałość zagregowanych korzeni do DAO. Dodatkowo, ponieważ zagregowany root musi obsługiwać dostęp innych podmiotów, może być konieczne delegowanie tego dostępu do innych Dao.

 6
Author: pablochacin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 17:06:42

DAO dostarcza abstrakcję na bazie danych/plikach danych lub innym mechanizmie persistence, dzięki czemu warstwa persistence może być manipulowana bez znajomości szczegółów jej implementacji.

Podczas gdy w klasach repozytorium można użyć wielu klas DAO wewnątrz jednej metody repozytorium, aby wykonać operację z "perspektywy aplikacji". Zamiast używać wielu DAO w warstwie domeny, użyj repozytorium, aby to zrobić. Repozytorium jest warstwą, która może zawierać pewne logiki aplikacji jak: Jeśli dane są dostępne w pamięci podręcznej, to pobierz je z pamięci podręcznej w przeciwnym razie, pobierz dane z sieci i przechowuj je w pamięci podręcznej do następnego pobierania.

 4
Author: Rahul Rastogi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-16 07:01:36

Repozytorium to nic innego jak dobrze zaprojektowane DAO.

ORM są centryczne, ale nie DAO.

Nie ma potrzeby używania kilku DAO w repozytorium, ponieważ samo DAO może zrobić dokładnie to samo z repozytoriami/podmiotami ORM lub dowolnym dostawcą DAL, bez względu na to, gdzie i jak samochód jest utrzymywany 1 Tabela, 2 tabele, N tabele, pół tabeli, usługa internetowa, tabela i usługa internetowa itp. Usługi korzystają z kilku DAO/repozytoriów.

Mój własny DAO, powiedzmy CarDao zajmuje się tylko samochodami DTO, mam na myśli, pobieraj tylko Car DTO na wejściu i zwracaj tylko Kolekcje car DTO lub car Dto na wyjściu.

Tak jak repozytorium, DAO faktycznie jest IoC, dla logiki biznesowej, pozwalając interfejsy persitence nie być zastraszane przez strategie persitence lub dziedzictwo. DAO zarówno zawiera strategię persitence i zapewnia interfejs persitence związany z domaine. Repozytorium to po prostu kolejne słowo dla tych, którzy nie rozumieli, czym właściwie jest dobrze zdefiniowane DAO.

 3
Author: Cyril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 15:07:05

Spróbuj dowiedzieć się, czy wzór DAO lub repozytorium jest najbardziej odpowiedni dla następującej sytuacji : Wyobraź sobie, że chcesz zapewnić jednolite API dostępu do danych dla trwałego mechanizmu do różnych typów źródeł danych, takich jak RDBMS, LDAP, OODB, repozytoria XML i pliki płaskie.

Należy również zapoznać się z poniższymi linkami, jeśli zainteresowany:

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
Author: javaDisciple,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-19 06:09:51

W frameworku spring znajduje się adnotacja o nazwie repozytorium, a w opisie tej adnotacji znajduje się przydatna informacja o repozytorium, która moim zdaniem jest przydatna w tej dyskusji.

Wskazuje, że klasa z adnotacją jest "repozytorium", pierwotnie definiowane przez Domain-Driven Design (Evans, 2003) jako " mechanizm dla enkapsulating storage, retrieval, and search behavior which emulates a kolekcja przedmiotów".

Drużyny implementacja tradycyjnych wzorców Java EE, takich jak " dostęp do danych Obiekt" może również zastosować ten stereotyp do klas DAO, choć troska należy wziąć pod uwagę rozróżnienie między dostępem do danych Repozytoria w stylu Object i DDD. Ta adnotacja jest stereotyp ogólnego przeznaczenia i poszczególne zespoły mogą zawęzić swoje semantyka i zastosowanie odpowiednio.

Klasa w ten sposób adnotowana kwalifikuje się do Spring DataAccessException tłumaczenie w połączeniu z Persistenceexceptiontranslationpostprocesor. Klasa z adnotacją to wyjaśniono również jego rolę w ogólnej architekturze aplikacji do celów oprzyrządowania, aspektów itp.

 1
Author: Ali Yeganeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-15 10:45:01

A DAO pozwala na prostszy sposób pobierania danych z magazynu, ukrywając brzydkie zapytania.

Repozytorium zajmuje się również danymi i ukrywa zapytania i to wszystko, ale repozytorium zajmuje się obiekty biznesowe / domeny.

Repozytorium użyje DAO do pobrania danych z magazynu i użyje tych danych do przywrócenia obiekt biznesowy.

Na przykład DAO może zawierać takie metody-

 public abstract class MangoDAO{
   abstract List<Mango>> getAllMangoes();
   abstract Mango getMangoByID(long mangoID);
}

I a repozytorium może zawierać taką metodę-

   public abstract class MangoRepository{
       MangoDao mangoDao = new MangDao;

       Mango getExportQualityMango(){

       for(Mango mango:mangoDao.getAllMangoes()){
        /*Here some business logics are being applied.*/
        if(mango.isSkinFresh()&&mangoIsLarge(){
           mango.setDetails("It is an export quality mango");
            return mango;
           }
       }
    }
}

Ten tutorial pomógł mi łatwo zdobyć główną koncepcję.

 1
Author: Gk Mohammad Emon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-20 18:54:59

W bardzo prostym zdaniu: znacząca różnica jest że repozytoria reprezentują zbiory, podczas gdy Dao są bliżej bazy danych, często są znacznie / align = "left" /

 -1
Author: Monsieur Aliréza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-17 17:04:00