В чем разница между шаблонами 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 располагаются ближе к базе данных, часто гораздо более ориентированные на таблицы.