Хорошо, думаю, я могу лучше объяснить, что я положил в комментариях :). Таким образом, в принципе, вы можете видеть оба этих варианта одинаково, хотя 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 немного более гибкий / универсальный, в то время как репозиторий немного более конкретен и ограничивает только тип.
IRepository
интерфейс. Вы бы хотели, чтобы ваш репозиторий использовал DAO в своей реализации. Помните, что DAO будет объектом для каждой таблицы, в то время как репозиторий почти всегда должен будет использовать несколько DAO для создания одного объекта. Если вы обнаружите, что это не тот случай, когда вашему репозиторию и сущности требуется доступ только к одной таблице, то вы, скорее всего, создаете анемичный домен.