Я много слышал о шаблоне хранилища, но я совершенно не понимал, что на самом деле должен делать хранилище. Когда я говорю «что на самом деле должен делать репозиторий», меня больше всего интересует, какие методы он должен предоставлять. Например, должен ли репозиторий действительно предоставлять методы CRUD, или он должен предоставлять какой-то другой метод?
Я имею в виду, должны ли репозитории содержать бизнес-логику или они должны просто содержать логику для связи с хранилищем данных и управления объектами, которые должны быть сохранены или загружены?
Также я слышал, что репозитории являются единицами сохранения для агрегатов. Но как это? Я не понимаю, как это работает на практике. Я думал, что у нас должен быть только один интерфейс, IRepository
который содержит методы CRUD, и тогда для любого объекта реализация будет просто содержать логику для сохранения и извлечения такого типа из хранилища данных.
источник
Ответы:
Хорошо, вы можете увидеть хороший пример в Spring Data Framework, который основан на концепции репозиториев.
Там вы увидите, что репозитории имеют дело только с хранилищем данных и редко содержат какую-либо бизнес-логику (это зарезервировано для уровня обслуживания). Так, например, вы посмотрите на их дизайн, вы увидите, что у них есть интерфейс CRUDRepository, который предоставляет методы для создания, уничтожения и восстановления сущностей (среди прочего). Существует также PagingAndSortingRepository, который добавляет дополнительные функциональные возможности именно для этого, сортировки и подкачки результатов и т. Д., И т. Д.
Таким образом, эта структура, возможно, является хорошим местом для изучения хорошего дизайна репозитория.
Насколько я знаю, многие из концепций, реализованных в Spring Data Framework, взяты из замечательной книги « Проектирование на основе доменов: решение сложных задач в основе программного обеспечения» , в книге есть целый раздел, посвященный проектированию репозитория.
Вы можете рассмотреть возможность получения его копии.
Небольшая выдержка из книги объясняет:
источник
Он не должен обеспечивать ни прямой интерфейс CRUD, ни бизнес-логику. Он является посредником между бизнес-логикой и базой данных. Интерфейс должен быть в терминах бизнес-логики, но не выполнять саму бизнес-логику, скорее как примитив бизнес-логики. В качестве примера скажем, что вы собирались построить систему электронной почты, у вас есть пользователи и сообщения. Ваш репозиторий будет обеспечивать базовые операции CRUD для пользователей и сообщений, но он также будет предоставлять отфильтрованные представления сообщений, таких как GetUsersNewMessages (пользователь) или GetSearchedMessages (пользователь, searchTerms).
Идея состоит в том, что репозиторий скрывает, как реализовано хранилище, и предоставляет чистый интерфейс, который обеспечивает быстрый гибкий доступ к данным. Ведение операций на высоком уровне с точки зрения того, что должно произойти, а не того, как это означает, что у вас больше гибкости для их реализации любым способом, который лучше всего подходит для основного резервного хранилища.
источник