Я покажу как опять полюбить DI и как настроить зависимости в приложении легко, красиво и правильно вместе с Toothpick. Пожалуюсь на боль от Dagger 2. И покажу как мигрировать на светлую сторону!
Более 6 лет в Android. Работал в ooApps, Phereo, i-Free, MobileUp. С мая 2017 г. – ведущий Android-разработчик в RedMadRobot. В 2015 году стал победителем конкурса Павла Дурова для Android- разработчиков «Telegram Challenge». Выступал на конференциях AppsConf 2016, DevFest Siberia 2016, Mobius 2017.
provide-методы 0) возможность скрывать реализацию интерфейсом 1) наглядные зависимости внутри Component 2) Scope только для provide-методов • избегание локального Component (далее)
provide-методы 0) возможность скрывать реализацию интерфейсом 1) наглядные зависимости внутри Component 2) Scope только для provide-методов • избегание локального Component (далее) • в реальности стал использовать инъекции зависимостей только в Activity/Fragment/Service...
для Router 2. интерфейс AppComponent 3. билдер компонента 4. сохранить ссылку на AppComponent SessionComponent 1. Аннотация для SessionScope 2. модуль с provide-методом для ChatInteractor 3. интерфейс SessionComponent 4. билдер саб-компонента 5. сохранить ссылку на SessionComponent
для Router 2. интерфейс AppComponent 3. билдер компонента 4. сохранить ссылку на AppComponent SessionComponent 1. Аннотация для SessionScope 2. модуль с provide-методом для ChatInteractor 3. интерфейс SessionComponent 4. билдер саб-компонента 5. сохранить ссылку на SessionComponent ChatComponent 1. модуль с provide-методом для chatId 2. интерфейс ChatComponent 3. билдер саб-компонента
для Router 2. интерфейс AppComponent 3. билдер компонента 4. сохранить ссылку на AppComponent SessionComponent 1. Аннотация для SessionScope 2. модуль с provide-методом для ChatInteractor 3. интерфейс SessionComponent 4. билдер саб-компонента 5. сохранить ссылку на SessionComponent ChatComponent 1. модуль с provide-методом для chatId 2. интерфейс ChatComponent 3. билдер саб-компонента Boilerplate
val router: Router, private val menuController: MenuController, private val screenParams: ScreenParams ) { //... } interface MenuController { fun open() fun close() }
для Router 2. интерфейс AppComponent 3. билдер компонента 4. сохранить ссылку на AppComponent SessionComponent 1. Аннотация для SessionScope 2. модуль с provide-методом для ChatInteractor 3. интерфейс SessionComponent 4. билдер саб-компонента 5. сохранить ссылку на SessionComponent ChatComponent 1. модуль с provide-методом для chatId 2. интерфейс ChatComponent 3. билдер саб-компонента Boilerplate
• Компонент -> скоуп • Удаляем билдеры компонентов • Теперь не надо хранить ссылки на компоненты • Не забываем убивать скоупы • Настройка перед релизом