Как (и зачем) использовать шаблон торта из Swinject

1656633368 kak i zachem ispolzovat shablon torta iz swinject

от Peter-John Welcome

1*AhTCkEaoe0JVpI8zJAxSTg
https://tinyurl.com/yacyj2pu

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

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

1*o8JOg5rpHYKVQ5DfjCvvMA

В комментариях я сделал несколько предложений. Одним из них было использование контейнера зависимостей.

Swinject, являющийся фреймворком, является одним из фреймворков внедрения зависимостей, реализующего шаблон контейнера зависимостей.

Вы можете спросить: зачем нам шаблон торта, если мы можем просто использовать Swinject? Или зачем нам пытаться использовать их вместе? Ну, это зависит от личных предпочтений. Но я хотел бы показать, как мы можем использовать эти два вместе.

Начинаем

Чтобы мы могли использовать Swinject в нашем проекте, нам нужно установить модуль.

pod 'Swinject'

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

  1. Зависимость – это будет тип, который мы регистрируем в контейнере.
  2. Реализация – реализация зависимости, которую мы хотим решить.
  3. ObjectScope – область, в которой мы хотим, чтобы существовала эта зависимость. (необязательно)

Наш второй протокол будет протоколом Resolvable, который будет иметь два метода. Первый – это метод resolve, принимающий тип зависимости и возвращающий конкретную реализацию этого типа. Второй – это метод сброса, который сбросит Resolvable для нас (полезно для тестирования).

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

Мы создадим контейнер Swinject и статический экземпляр в нашем классе контейнера зависимостей.

Предупреждение: этот код написан в Swift 4, где private можно использовать в расширениях (не как в Swift 3, где требуется fileprivate).

Во-первых, мы будем соответствовать протоколу Registrable и использовать контейнер Swinject, который мы создали, и регистрировать наши зависимости от него с его соответствующими реализациями. Мы также укажем, что objectScope будет графом по умолчанию.

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

Свинджект/Свинджект
Swinject – структура внедрения зависимостей для Swift с iOS/macOS/Linuxgithub.com

Далее мы соответствуем протоколу Resolvable и снова используем тот же контейнер Swinject для решения зависимостей. Мы сбросим контейнер в методе reset, удалив все зарегистрированные зависимости от контейнера.

Теперь у нас есть контейнер зависимостей – Ура!! Но как мы используем этот контейнер для разрешения наших зависимостей?

Мы создадим фабрику Resolver, которая справится с этим за нас. Сначала он будет обладать свойством контейнера типа Resolvable, и он будет инициализирован экземпляром класса контейнера зависимостей. Мы производим этот контейнер типа Resolvable, чтобы мы могли заменить его любым экземпляром контейнера зависимостей, который соответствует этому протоколу.

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

Мы создали эту фабрику Resolver, и теперь пора ею воспользоваться.

Создавая наше расширение протокола (где мы решали нашу реализацию в предыдущей статье), мы можем использовать нашу фабрику Resolver.

Нам нужно помнить, что теперь нам придется зарегистрировать нашу зависимость от нашего контейнера.

Вот у нас есть шаблон торта со Swinject как нашим контейнером зависимостей.

Преимущества

Преимущества этого подхода в том, что мы разъединяем компоненты нашей программы и предоставляем единственный источник решения для этих компонентов. Это также облегчает нам замену реализации на макеты для тестирования.

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

Модульные тесты

Как мы бы это проверили? Все, что нам нужно сделать это вызвать reset на Resolver, а затем зарегистрировать зависимости с помощью фиктивных реализаций.

Сейчас мы вводим наши макеты. Кажется, мы кончили.

Иди попробуй! Дайте мне знать, что вы думаете.

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

Связаться!

Полный пример вы можете найти на моем Github.

pjwelcome/CakePatternWithSwinject
CakePatternWithSwinject – шаблон торта со Swinject как контейнером зависимостейgithub.comПитер Джон (@pjapplez) | Twitter
Последние твиты от Питера-Джона (@pjapplez). Разработчик мобильных приложений, исследователь технологий, фотограф, соучредитель…twitter.com

Питер Джон Добро пожаловать — Google+

Спасибо Эштону Добро пожаловать и Кигану Рашу за просмотр этой публикации.

Добавить комментарий

Ваш адрес email не будет опубликован.