Столкнулся с Circular Dependency, как правильно спроектировать слой работы с внешним истоничком данных (REST API)?
Всем привет.
Есть REST API для которого нужно написать небольшой клиент. Решил сделать следующим образом:
Есть классы UserMapper и PostMapper.
В классе UserMapper есть метод getUserWithPosts($userId), в классе PostMapper есть методы getPostWithUser($postId) и getPostListByUserId($userId) .
Внутри метода getUserWithPosts($userId) класса UserMapper я отправляю запрос к api где запрашиваю пользователя по id и заполняю данными модель User, после чего внутри UserMapper вызываю PostMapper и его метод getPostListByUserId($userId) где выполняется запрос к api и запрашиваются посты пользователя, после чего маплю модель Post и добавляю ее в PostCollection объект и ссылку на эту коллекцию записываю в User.
Проблема в следующем, начал использовать Dependency Injection Container с внедрением зависимостей через конструктор. И тут получилось следующее: у меня UserMapper зависит от PostMapper (внутри метода getUserWithPosts($userId) вызывается PostMapper и загружаются посты) и PostMapper зависит от UserMapper (внутри метода getPostWithUser() загружается пост и загружается пользователь через UserMapper).
Таким образом, возникает ошибка Circular Dependency, зависимости разрулится не могут так как указывают друг на друга.
Посоветуйте кто как разруливает доменную модель когда источник не база данных, а REST API? Можно конечно внутри метода маппера не вызывать другой маппер, а продублировать логику из другого маппера, тогда конечно такой ошибки больше не будет, но мне не нравится что логика будет дублироваться.
Была еще идея создать UserService, где будет метод getUserWithPosts и уже внутри этого метода вызывать два маппера, тогда они друг от друга зависеть не будут. Но не знаю на сколько это правильно.
Имхо сделать инъекцию в сервисе наиболее верный вариант. по крайней мере я однажды столкнулся с подобным и вынес зависимости на более высокий слой. подпишусь, может будут другие советы.