Строгий шаблон репозитория должен реализовывать только get (), delete () и create () и, возможно, варианты get (), где можно искать или извлекать всю коллекцию
Интерфейс репозитория является частью вашего домена и должен быть максимально основан на Ubiquitous Language .Все хранилища разные, как и все ваши агрегаты.Строгое, универсальные репозитории являются чрезмерной генерацией CRUD и могут снизить выразительность кода.Метод 'Create' также не принадлежит Repository, потому что начало жизненного цикла объекта обычно обрабатывается Factory или самим объектом.«Добавить» выглядит лучше, если вы хотите сохранить существующий объект, потому что репозиторий имеет семантику коллекции.
Вопрос здесь заключается в том, как реализовать сложные запросы, включающие множество агрегированных корней.Например, у нас есть два совокупных корня - продукт и пользователь.Если я делаю страницу со списком продуктов , которые пользователь купил , то у меня есть запрос, который охватывает как совокупность пользователей, так и совокупность продуктов.
В этом случаеВы просто должны прислушиваться к бизнес-требованиям, я подчеркнул ту часть, которую я считаю наиболее важной.Исходя из этого, похоже, что вам нужно:
Products products = /* get Products repository implementation */;
IList<Product> res = products.BoughtByUser(User user);
Идея организации такого кода состоит в том, чтобы максимально соответствовать бизнес-требованиям и вездесущему языку.Имена интерфейсов репозитория также важны, я предпочитаю иметь Products или AllProducts вместо ProductsRepository .Фил Кальсадо имеет очень хорошую статью на эту тему, настоятельно рекомендуется.
How should this query be implemented?
Ничего особенного в этом запросе нет, он может быть реализован так же, как и все другие запросы в репозитории продуктов.Сам запрос скрыт от Домена, потому что репозиторий , реализация относится к уровню доступа к данным.Доступ к данным может реализовать любой запрос, поскольку он обладает глубокими знаниями обо всех агрегатах и их взаимосвязях.На этом этапе это будет просто вопрос Hibernate или SQL.