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

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

DAO является абстракцией сохранения данных. Репозиторий – это абстракция коллекции объектов.

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

Кроме того, repository обычно представляет собой более узкий интерфейс. Это должен быть просто набор объектов с помощью Get(id) , Find(ISpecification) , Add(Entity) . Такой метод, как « Update , подходит для DAO, но не для репозитория. При использовании репозитория изменения в объектах обычно отслеживаются отдельными UnitOfWork.

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

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

СКЛАД:

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

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

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

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

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

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

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

в заключение

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

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

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

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

Теперь, как мы можем реализовать этот принцип? Ну, один известный способ реализации этого, в частности с такими фреймворками, как Hibernate, – это шаблон DAO.

Шаблон DAO является способом генерации DAL, где обычно каждый объект домена имеет свой собственный DAO. Например, User и UserDao , Appointment и AppointmentDao UserDao и т. Д. Пример 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 уже предоставляют набор операций, подобный коллекции, то в чем же потребность в дополнительном слое поверх него?

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

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

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

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

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

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

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

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

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

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

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

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

Попытайтесь выяснить, подходит ли 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

Interesting Posts

Разница между . и: в Луа

Избегайте корпоративных заблокированных URL-адресов, когда в Cisco VPN

Что означают круглые скобки вокруг имени функции?

Можно ли импортировать модули из всех файлов в каталоге, используя подстановочный знак?

Unix: Есть ли способ «скопировать» разрешения файлов или каталогов?

Полноэкранный режим в Android?

Автоматизация Office через службу Windows на сервере 2008

Запуск приложений как администратора по умолчанию в Windows 10

Почему я получаю сообщение «Failed to bounce to type», когда я включаю JSON из Firebase в объекты Java?

Вопросы для тех, кто использовал клавиатуру Sun Type 7

Моя клавиатура Windows «умна» с ключами цитат – как я могу ее остановить?

Случайный взвешенный выбор в Java

Как извлечь текст, который находится между круглыми скобками (круглые скобки)?

Что на самом деле контролирует настройка MySQL max_allowed_packet?

найти местоположение символа в строке

Давайте будем гением компьютера.