Давайте изучим внедрение зависимостей в Swift

«Внедрение зависимостей» Звучит красиво, не правда ли?

Когда я услышал об этом, подумал, что это сложная концепция, и ее может быть сложно изучить. Итак, в этой статье мы увидим, сложно ли учиться.

Есть три способа, которыми мы можем использовать внедрение зависимостей в swift:

  1. Инъекция инициализатора
  2. Инъекция метода
  3. Внедрение свойств

Теперь, когда мы знаем типы, я полагаю, что некоторые люди уже поняли, что знают эти термины, но не понимают, что это форма «инъекции».

Прежде чем узнать о внедрении зависимостей, давайте посмотрим, какие проблемы оно решает.

Давайте посмотрим на этот код:

Что мы делаем с приведенным выше кодом

  • Мы определили два модуля BaseNetworkModule для обработки сетевых вызовов и BaseImageDownloder для загрузки изображений.
  • MyViewController использует базовые классы для использования вышеуказанной функциональности.

Теперь предположим, что нам нужно заменить BaseNetworkModule и BaseImageDownloder чем-то другим.

  • Теперь, когда наш код тесно связан с этими модулями, при необходимости будет сложно вносить изменения.
  • Если нам нужно протестировать MyViewController с фиктивными модулями, мы не сможем этого сделать.

Теперь, когда мы знаем проблемы, давайте рассмотрим, как внедрение зависимостей поможет нам решить эти проблемы.

Внедрение инициализатора

В приведенном выше коде вместо инициализации модулей networkModule и imageDownloder внутри класса мы присваиваем эти переменные с помощью его метода init(networkModule: imageDownloder:).

При этом мы не зависим от MyViewContoller для их инициализации, и это дает нам больший контроль над тем, какой объект передавать.

Давайте рассмотрим этот модульный тест

Мы легко заменили наши networkModule и imageDownloder фиктивными моделями.

Теперь более гибко изменять зависимые объекты в соответствии с требованиями. В приведенном выше фрагменте кода мы заменили ImageDowloader классом LocalImageLoader.

Если мы используем инициализатор для внедрения зависимостей, которые называются Initialiser Dependency Injection.

2. Внедрение метода

Это похоже на использование Initialiser Dependency Injection, но вместо инициализатора у нас будут методы для внедрения зависимостей.

Давайте посмотрим, как это выглядит в коде.

Вы можете видеть, что у нас есть новый метод, в котором у нас есть два параметра networkModule и imageDownloder, и мы присваиваем эти значения нашим зависимостям.

Это может пригодиться, когда мы используем файлы раскадровки или xib.

Проблема с этим типом внедрения зависимостей заключается в том, что легко забыть реализовать эти методы, и если мы не будем внимательны, мы можем изменить зависимость по незнанию.

3. Внедрение свойств

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

Это дает нам гибкость изменения зависимостей по мере необходимости, но это уязвимо для непреднамеренных изменений.

Итак, теперь большой вопрос «Что такое внедрение зависимостей?»

Это внедрение зависимостей в объект вместо того, чтобы объект создавал свои зависимости.

Теперь я надеюсь, что внедрение зависимостей больше не кажется таким сложным.

Существует сторонняя мощная облегченная библиотека внедрения зависимостей:

github 

В следующей части этого раздела внедрения зависимостей я расскажу о вышеупомянутой библиотеке. Если вы хотите изучить вышеупомянутую библиотеку, добавьте этот раздел в закладки для обновления.