Ответ 1
В общем случае, если вы используете "истинный" шаблон репозитория, в отличие от других уровней персистентности (например, ActiveRecord или DAO), вы должны стремиться идентифицировать агрегаты своего домена и создавать один репозиторий для каждого агрегата.
Что это значит? Это зависит от вашего приложения, но обычно есть объекты, которые, естественно, являются "родителями" других объектов или являются частью связанной транзакции.
Я думаю, что канонический пример - это система электронной торговли, в которой у вас есть концепция заказа, и в порядке, в котором у вас есть порядок, каждая строка заказа - это какой-то продукт и количество, и так далее.
В этом случае объект Order является одним из корней системы и создается OrderRepository.
Вещь, которую следует помнить в этом случае, заключается в том, что между порядком и его порядковыми строками существует некоторая взаимосвязь (подразумеваемая или нет) и т.д. Таким образом, части C-UD "CRUD" в репозитории обычно должны быть только одним методом, и обычно должны просто принимать экземпляр этого совокупного корневого объекта и работать с ним (например, repo.Save(order)). Возможны и другие возможные параметры, но это зависит от ваших возможностей.
В самом деле, вы часто можете решить большую часть части C-UD w/inheritance (т.е. создать RepositoryBase, которая реализует их, используя некоторую известную логику о том, что произойдет для вашей конкретной схемы сохранения).
Итак, это оставляет нам часть R CRUD. В этом случае вы можете получить тонну методов запроса (GetById; GetByName; GetByCustomerName и т.д.), Если вы решите пройти маршрут метода запроса. Некоторые люди предпочитают, особенно для простых приложений, выставляя интерфейс на основе linq (например, IQueryable GetAll()), который может иметь предложения Where. YMMV в зависимости от вашей основной стойкости на этом, но это сплошной снимок для простых приложений, особенно. если вы ожидаете, что ваш провайдер постоянства напрямую поддержит linq.
Наконец, многие люди фактически выделяют часть запроса через одно имплантацию или другое из шаблона разделения ответственности запросов команд, в котором говорится, что интерфейсы для сохранения и запросов должны отличаться. В этом случае у вас будет Repo, у которого есть только базовые CRUD (GetById, GetAll, Save, Delete) ops и другой класс, который задает вопросы, основанные на ваших намерениях приложения.
Надеюсь, что это поможет.
Пол