В чем разница между шаблонами DAO и Repository?

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

СКЛАД:

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

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

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

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

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

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

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

Наконец

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

Ответ 3

Схема 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, шаблон репозитория реализуется с помощью DAO. Это экземпляр DAL может быть одновременно экземпляром шаблона DAO и шаблоном репозитория.

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

Ответ 4

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

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

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

Ответ 5

Repository более абстрактный домен ориентированный термин, который является частью домена 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

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

Ответ 7

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

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

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

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

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

Ответ 8

Попробуйте выяснить, применим ли 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

Ответ 9

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

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

Ответ 10

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