Dagger 2
Лечим зависимости
по методике
:)
Докладчик: Constantine
Mars
Senior Developer @ DataArt,
Co-Organizer @ GDG Dnipro
Slide 2
Slide 2 text
Dependency Injection
Что, зачем, и когда это нужно
Slide 3
Slide 3 text
Создание классов порождает...
• Композиция - не наследование
• Ссылки не будут пустовать
Slide 4
Slide 4 text
Возможность создавать объекты...
Slide 5
Slide 5 text
Создавать разные объекты...
Slide 6
Slide 6 text
Комбинировать объекты
(“композиция” объектов)...
Slide 7
Slide 7 text
Использовать наследование
и разнообразить композицию...
Slide 8
Slide 8 text
И… Зависимости
Car depends on Engine. Engines may vary. We’ll probably
need different engines for testing and production
Slide 9
Slide 9 text
Dagger and JSR-330
Аннотация @Inject
Slide 10
Slide 10 text
немного еще НЕ истории
• Dagger 2 - Google, Greg Kick
• Dagger - Square, Jake Wharthon
• Guice - Google, Jesse Wilson
Slide 11
Slide 11 text
Inversion of Control
Invert your dependencies
Slide 12
Slide 12 text
Reflection vs Compile time
• Dagger 2 vs Dagger 1
Slide 13
Slide 13 text
JSR-330
Slide 14
Slide 14 text
Puttin’ there piece of magic...
Slide 15
Slide 15 text
Обратите внимание
на конструктор по умолчанию
Slide 16
Slide 16 text
А вот конструктор с параметрами
-
хорошее место для модификаций...
Slide 17
Slide 17 text
И все же, как это заставить работать?
Slide 18
Slide 18 text
Структура инжекции
Dagger 2.0
Модули, Компоненты
Slide 19
Slide 19 text
Компоненты и модули
Pic. author - Miroslaw Stanek from Azimo
http://frogermcs.github.io/dagger-graph-creation-performance/
Slide 20
Slide 20 text
Модуль…
next slide, please
Slide 21
Slide 21 text
Модуль - коллекция генераторов
Slide 22
Slide 22 text
Компонент -
хост для модулей,
инжектор для классов,
корень дерева зависимостей
Slide 23
Slide 23 text
То же самое,
только с красными стрелочками
:]
Slide 24
Slide 24 text
Инициализация компонента
generated code used
Slide 25
Slide 25 text
Inject This! :)
Puttin’ magic will work only after injection… ;)
Slide 26
Slide 26 text
Inject This! :)
Slide 27
Slide 27 text
Custom Scopes
и эффективное
управление памятью
Slide 28
Slide 28 text
Жизненный цикл объектов
Pic. author - Miroslaw Stanek from Azimo
http://frogermcs.github.io/dagger-graph-creation-performance/
Slide 29
Slide 29 text
И еще раз та же матрешка
Компонент имеет область жизни (scope)
Pic. author - Miroslaw Stanek from Azimo
http://frogermcs.github.io/dagger-graph-creation-performance/
Slide 30
Slide 30 text
This mysterious ‘plus’...
Slide 31
Slide 31 text
Объявление суп-компонента
Slide 32
Slide 32 text
Но ведь там был модуль! =)
Slide 33
Slide 33 text
Добавление субкомпонента
к корню
дерева зависимостей
Slide 34
Slide 34 text
Как управлять временем жизни
субкомпонентов?
Pic. author - Miroslaw Stanek from Azimo
http://frogermcs.github.io/dagger-graph-creation-performance/
Slide 35
Slide 35 text
Аннотация @Scope
Slide 36
Slide 36 text
@ActivityScope
Slide 37
Slide 37 text
@ActivityScope
Slide 38
Slide 38 text
@UserScope
Slide 39
Slide 39 text
@UserScope
Slide 40
Slide 40 text
@UserScope
Slide 41
Slide 41 text
Напоследок… Что инжектить?
• Модули демо-данных
• Презентеры
• Синглетоны
• Тестовые реализации классов
• ...Все остальное что инстанцируется и создает
зависимости :)
Slide 42
Slide 42 text
Home readings
Sample code: https://github.com/c-mars/Dagger2Scopes.git
• Fernando Cejas “Tasting Dagger 2 on Android”:
http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/
•
• Miroslaw Stanek “Dagger2 - graph creation performance:
http://frogermcs.github.io/dagger-graph-creation-performance/
•
• Dagger2 official page: http://google.github.io/dagger/
Slide 43
Slide 43 text
Смысл кода
Как мы организовали быструю Agile-разработку с
использованием Mock-модулей, и в итоге
обгонали сервер-сайд