В чем разница между шаблонами DAO и Repository? - PullRequest
374 голосов
/ 18 декабря 2011

В чем разница между объектами доступа к данным (DAO) и шаблонами репозитория? Я разрабатываю приложение, используя Enterprise Java Beans (EJB3), Hibernate ORM в качестве инфраструктуры, и доменно-управляемое проектирование (DDD) и тест-управляемую разработку (TDD) в качестве методов проектирования.

Ответы [ 10 ]

395 голосов
/ 18 декабря 2011

DAO - это абстракция постоянство данных .
Repository - это абстракция коллекции объектов .

DAO будет считаться ближе к базе данных, часто ориентированной на таблицу.
Repository будет считаться ближе к Домену, имея дело только с Совокупными Корнями.

Repository может быть реализовано с использованием DAO, но вы не сделали бы обратное.

Кроме того, Repository обычно является более узким интерфейсом. Это должна быть просто коллекция объектов с Get(id), Find(ISpecification), Add(Entity).

Метод, подобный Update, подходит для DAO, но не Repository - при использовании Repository изменения в сущностях обычно отслеживаются отдельным UnitOfWork.

Кажется распространенным видеть реализации, называемые Repository, которые на самом деле больше DAO, и, следовательно, я думаю, что между ними существует некоторая путаница.

104 голосов
/ 20 марта 2013

ОК, думаю, я могу лучше объяснить, что я положил в комментарии :). Таким образом, в принципе, вы можете видеть оба этих варианта одинаково, хотя DAO - более гибкий шаблон, чем Repository. Если вы хотите использовать оба, вы должны использовать репозиторий в ваших DAO. Я объясню каждый из них ниже:

СКЛАД:

Это хранилище объектов определенного типа - оно позволяет вам искать объекты определенного типа, а также сохранять их. Обычно он будет обрабатывать только один тип объектов. Например. AppleRepository позволит вам сделать AppleRepository.findAll(criteria) или AppleRepository.save(juicyApple). Обратите внимание, что в репозитории используются термины модели домена (а не термины БД - ничего не связано с тем, как данные хранятся где-либо).

Хранилище, скорее всего, будет хранить все данные в одной таблице, тогда как шаблон не требует этого. Однако тот факт, что он обрабатывает только один тип данных, делает его логически связанным с одной главной таблицей (если используется для сохранения БД).

DAO - объект доступа к данным (другими словами - объект, используемый для доступа к данным)

DAO - это класс, который определяет местонахождение данных для вас (в основном это поиск, но обычно он также используется для хранения данных). Шаблон не ограничивает вас для хранения данных одного типа, поэтому вы можете легко иметь DAO, который находит / хранит связанные объекты.

например. вы можете легко получить UserDao, который предоставляет такие методы, как

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

Все это относится к Пользователю (и безопасности) и может быть указано в том же DAO. Это не относится к хранилищу.

Наконец

Обратите внимание, что оба шаблона действительно означают одно и то же (они хранят данные и абстрагируют доступ к ним, и они оба выражены ближе к модели предметной области и почти не содержат ссылок на БД), но способ их использования может немного отличаться DAO - немного более гибкий / универсальный, а Repository - немного более конкретный и ограничивающий только тип.

73 голосов
/ 20 февраля 2013

DAO и шаблон репозитория являются способами реализации уровня доступа к данным (DAL).Итак, давайте начнем с DAL. Сначала.

Объектно-ориентированные приложения, которые обращаются к базе данных, должны иметь некоторую логику для обработки доступа к базе данных.Чтобы сохранить код чистым и модульным, рекомендуется, чтобы логика доступа к базе данных была изолирована в отдельный модуль.В многоуровневой архитектуре этот модуль является DAL.

До сих пор мы не говорили о какой-либо конкретной реализации: только общий принцип, заключающийся в размещении логики доступа к базе данных в отдельном модуле.

Теперькак мы можем реализовать этот принцип?Хорошо, один из известных способов реализации этого, в частности с помощью таких сред, как Hibernate, - это шаблон DAO.

Шаблон DAO - это способ создания DAL, где обычно каждый объект домена имеет свой собственный DAO.Например, User и UserDao, Appointment и AppointmentDao и т. Д. Пример DAO с Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html.

Тогда что такое шаблон репозитория?Как и DAO, шаблон репозитория также является способом достижения DAL.Основной момент в шаблоне репозитория заключается в том, что с точки зрения клиента / пользователя он должен выглядеть или вести себя как коллекция.Под поведением «коллекции» подразумевается не то, что ее нужно создавать как Collection collection = new SomeCollection().Вместо этого это означает, что он должен поддерживать такие операции, как добавление, удаление, содержание и т. Д. Это суть шаблона репозитория.

На практике, например, в случае использования Hibernate, шаблон Repository реализуется с помощью DAO.То есть экземпляр DAL может быть одновременно экземпляром шаблона DAO и шаблоном репозитория.

Шаблон репозитория не обязательно является чем-то, что строится поверх DAO (как некоторые могут предположить).Если DAO спроектированы с интерфейсом, который поддерживает вышеупомянутые операции, то это экземпляр шаблона репозитория.Подумайте об этом: если DAO уже предоставляют набор операций, подобный коллекции, тогда зачем нужен дополнительный слой поверх него?

61 голосов
/ 08 июля 2012

Честно говоря, это выглядит как семантическое различие, а не техническое различие.Фраза «Объект доступа к данным» вообще не относится к «базе данных».И, хотя вы могли бы спроектировать его так, чтобы он был ориентирован на базу данных, я думаю, что большинство людей посчитают это недостатком дизайна.

Цель DAO - скрыть детали реализации механизма доступа к данным.Чем отличается шаблон репозитория?Насколько я могу сказать, это не так.Сказать, что репозиторий отличается от DAO, потому что вы имеете дело с / возвращаете коллекцию объектов, не может быть правильным;DAO также могут возвращать коллекции объектов.

Все, что я читал о шаблоне репозитория, похоже, опирается на это различие: плохой дизайн DAO против хорошего дизайна DAO (он же шаблон проектирования репозитория).

16 голосов
/ 19 декабря 2011

Репозиторий - это более абстрактный термин, ориентированный на домен, который является частью Domain Driven Design, он является частью дизайна вашего домена и общим языком, DAO - это техническая абстракция для технологии доступа к данным, репозиторий касается только управления существующими данными и фабриками. для создания данных.

проверьте эти ссылки:

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

6 голосов
/ 18 июля 2012

Ключевым отличием является то, что репозиторий обрабатывает доступ к корням агрегата в агрегате, а DAO обрабатывает доступ к объектам.Поэтому, как правило, репозиторий делегирует фактическое сохранение совокупных корней DAO.Кроме того, поскольку сводный корень должен обрабатывать доступ других объектов, ему может потребоваться делегировать этот доступ другим DAO.

3 голосов
/ 12 августа 2013

Репозиторий - не что иное, как хорошо разработанный DAO.

ORM ориентированы на таблицу, но не DAO.

Нет необходимости использовать несколько DAO в репозитории, поскольку сам DAO может делать то же самое с репозиториями / сущностями ORM или любым поставщиком DAL, независимо от того, гдеи как сохраняется машина: 1 таблица, 2 таблицы, n таблиц, половина таблицы, веб-сервис, таблица, веб-сервис и т. д. Сервисы используют несколько DAO / репозиториев.

Мой собственный DAO, скажем такCarDao имеет дело только с Car DTO, я имею в виду, только Car DTO на входе и только возврат Car DTO или car DTO на выходе.

Так что, как и Repository, DAO на самом деле является IoC для бизнес-логики,не допускать запугивания интерфейсов персистентности стратегиями переноса или наследствами.DAO как инкапсулирует стратегию персистентности, так и обеспечивает интерфейс персистентности, связанный с доменом.Репозиторий - это просто другое слово для тех, кто не понял, что такое четко определенный DAO.

2 голосов
/ 14 марта 2019

DAO предоставляет абстракцию для файлов базы данных / данных или любого другого механизма персистентности, чтобы можно было манипулировать уровнем персистентности, не зная деталей его реализации.

Принимая во внимание, что в классах репозитория несколько классов DAO могут использоваться в одном методе репозитория для выполнения операции с точки зрения приложения. Таким образом, вместо использования нескольких DAO на уровне домена, используйте репозиторий, чтобы сделать это. Репозиторий - это слой, который может содержать некоторую прикладную логику , например: если данные доступны в кеше в памяти, извлекайте их из кеша, в противном случае извлекайте данные из сети и сохраняйте их в кеше в памяти для последующего извлечения. .

2 голосов
/ 19 декабря 2011

Постарайтесь выяснить, является ли DAO или шаблон репозитория наиболее подходящим для следующей ситуации: представьте, что вы хотели бы предоставить единый API доступа к данным для постоянного механизма для различных типов источников данных, таких как RDBMS, LDAP, OODBРепозитории XML и плоские файлы.

Также, если вы заинтересованы, смотрите также следующие ссылки:

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

0 голосов
/ 17 ноября 2018

в очень простом предложении: существенная разница что репозитории представляют коллекции, в то время как DAO находятся ближе к базе данных, часто гораздо Таблица-ориентированная.

...