Столкнулся с 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 и уже внутри этого метода вызывать два маппера, тогда они друг от друга зависеть не будут. Но не знаю на сколько это правильно.

21 Авг 2019 в 07:03
209 +1
0
Ответы
1

Для разрешения проблемы Circular Dependency в вашем случае, рекомендуется использовать концепцию сервисов или репозиториев.

Вы можете создать сервис UserService, который будет использовать как UserMapper, так и PostMapper для получения данных пользователя и его постов. Таким образом, сервис UserService будет отвечать за работу с данными с API и избегать прямой зависимости между мапперами.

Примерно такой подход может выглядеть следующим образом:

class UserServic

private $userMapper
private $postMapper
public function __construct(UserMapper $userMapper, PostMapper $postMapper

$this->userMapper = $userMapper
$this->postMapper = $postMapper

public function getUserWithPosts($userId

$user = $this->userMapper->getUser($userId)
$posts = $this->postMapper->getPostListByUserId($userId)
$user->setPosts($posts)
return $user

}

Такой подход позволит вам избежать Circular Dependency и сделать вашу структуру кода более гибкой и удобной для дальнейшего расширения.

20 Апр в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 620 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир