Исходя из вашего примера, хранилища должны быть настроены с точки зрения их взаимозависимости. Все рассуждения о разработке MicroServices и Domain Driven Design применимы здесь: в некоторых случаях допускается дублирование кода, работа с интерфейсами, не нарушайте совместимость, если это не требуется, и т. Д.
Теперь, на мой взгляд, пользовательский интерфейс должен быть независимым от серверной части. Таким образом, репозиторий проекта пользовательского интерфейса обычно должен содержать код пользовательского интерфейса и контроллер клиента. Клиентский контроллер будет соединяться с сервисными контроллерами абстрактно. Они будут использовать сервисную абстракцию client / api, которая имеет версии отдельно от сервиса, так что сервис может быть обновлен, не нарушая клиент (ы) (может быть несколько разных клиентов).
Таким образом, сама служба должна быть собственным хранилищем. На мой взгляд, сервис - это просто оболочка для бизнес-логики, основанной на единой сути. Таким образом, бизнес-логика обычно должна быть отделена от сервисной технологии, которая ее размещает. С другой стороны, реализация репозитория обычно настолько тесно связана с бизнес-логикой, что может быть интегрирована в тот же репозиторий. Но даже там ваш пробег может варьироваться.
Конечно, простые проекты, которые вряд ли сильно изменятся с точки зрения технологии или поддержки нескольких стеков, где весь пользовательский интерфейс может быть размещен из того же источника, что и бэкэнд, а бэкэнд-сервисы обычно используются только одним и тем же клиентом, могут получить больше преимуществ тесно интегрированные репозитории.
В этом случае вам, вероятно, будет достаточно иметь полную вертикаль в одном репозитории и сосредоточиться на том, чтобы убедиться, что ваши функциональные домены должным образом автономны в своем собственном репозитории. Тогда у вас все еще есть большинство преимуществ меньших репозиториев, и, в противном случае, небольшие накладные расходы.