Я видел несколько способов сделать это.
Самый распространенный способ - использовать внедрение зависимостей для внедрения репозиториев в объекты, которые их используют. Обычно это классы презентатора или контроллера, но в некоторых случаях модель вызывает хранилище. Обычно лучше избегать этого. Если вы можете использовать di-контейнер для этого, то сделайте это.
Вы также можете заставить репозитории реализовывать шаблон синглтона. Я постараюсь избежать этого, потому что синглтоны обычно используют статические методы. Это может затруднить тестирование кода, который вызывает одиночные вызовы. Если вам нужно так поступить, убедитесь, что вы выделяете код, который вызывает singleton, и используете «ручную» инъекцию зависимостей для внедрения синглетонов в вызывающие их классы. Это избавляет от некоторой жесткой связи, которую вы иначе получили бы.
Я видел несколько примеров, когда хранилища никогда не вызывались. Когда кто-то перемещается по графу объектов в модели и запрашивает не загруженный объект, модель просто вызывает событие, и хранилище реагирует на это событие. Таким образом, нет никаких вызовов в хранилище, и он полностью отделен от модели. Я сам не использовал эту архитектуру, но она кажется очень чистой.