Получается, что ProductRepository зависит от других репозиториев (Category, ProductType, Image, File....).
Это уж как сделаете. Может зависеть, а может и нет. Я бы не завязывал одно на другое. Пусть там будет похожий код... ничего страшного.
Теперь главный вопрос - как собирать товар (или другую сущность) из разных кусков?
Руками.
Как обрабатывать метод $productRepository->save($product), если разные куски товара сохраняются по-разному.
Индивидуально. Руками.
Как быть с масштабированием, если в будущем появится еще что-то?
Или взять ORM или, опять же, руками. Не бойтесь писать код и не бойтесь его дублирования в разумных пределах. Не всё то DRY что им кажется.