На мой взгляд, это будет зависеть от вашего дизайна / архитектуры. Какова цель хранилища? Выполните CRUD операции (создание, чтение, обновление и удаление).
Если вы используете модели анемичных доменов в классической трехуровневой архитектуре, вся логика, применяемая к моделям, создается в сервисах.
В этом случае выбор очевиден: вы не должны вызывать хранилище напрямую.
Зачем ? Поскольку ваши модели глупы и логика в сервисах, вы можете создавать недопустимые модели. Если вы можете вызвать хранилище, вы можете создать / обновить неверную модель в базе данных. Если вы позвоните в службу, она сможет исправить или заполнить вашу модель, прежде чем создавать / обновлять ее.
Если вы используете модель rich domain в луковой архитектуре, то она другая. Так как ваши модели должны быть всегда действительными (когда вы создаете их из конструктора или из фабрики, все проверки были выполнены, и когда вы обновляете одну из них, это одно и то же), вы можете без каких-либо проблем вызывать непосредственно хранилище.
В этом контексте вся логика находится в моделях напрямую, а сервисы просто используются для хранения логики, которая не принадлежит конкретной модели.
Теперь вопрос не в том, «как использовать репозиторий», а в том, «какой дизайн / архитектура мне нужен?» и на первый вопрос будет дан ответ: -)