Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Injection on Android
Pedro Vicente Gómez Sánchez
Senior Android Developer at Karumi
pedro@karumi.com
@pedro_g_s
github.com/pedrovgs
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Alberto Gragera
Technical Director
Jorge Barroso
Senior Android Developer
Davide Mendolia
Senior Full Stack Engineer
Sergio Gutierrez
Senior Full Stack Engineer
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Agenda
● Introduction.
● What can I do using Dependency Injection?
● Scoped Graphs.
● Dagger on Android.
● Dagger 2.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Introduction
Inversion of Control
vs
Dependency Inversion
vs
Dependency Injection
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Inversion of Control
The natural evolution of the structured and imperative
programming and the usage of reusable frameworks.
The execution point where you software takes the control
is not defined by your software.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Inversion
One of the most important S.O.L.I.D principles.
Depend on abstractions, forget about implementation
details.
Provide implementation details depending on
abstractions can be tedious.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Injection
Software Design Pattern used to facilitate the usage of
Dependency Inversion.
Provides dependencies given some previous
configuration where abstractions are linked with
concretions.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Why?
The usage of IoC, Dependency Inversion and Dependency
Injection provides give us the following benefits:
● Testability.
● Decoupling.
● Modularity.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Show me the code!
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Injection Example
The presenter inside this fragment has to be instantiated
with all the dependency tree. Without a dependency
injector this can be tedious.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Injection Example
All the dependencies are passed in construction.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Injection Example
The implementation details are part of the Dependency
Injector configuration.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dependency Injection Example
Now the Presenter is injected into the Fragment.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do with a
Dependency Injector?
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
● Do not link the class to the runtime lifecycle or frameworks.
● Improve testability.
● Decouple your code and improve our software design.
● Detect code smells related to class dependencies and SRP violations.
● Change the implementation details in build time.
● Extract implementation details out of the business logic.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Do not link the class to the runtime lifecycle.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Improve testability.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Detect code smells related to class dependencies and single
responsibility principle violations.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Change the implementation details in build time.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Decouple your code and improve our software design.
Using a Dependency Injector combined with the correct usage of
Dependency Inversion we can easily develop the same feature at the
same time in different teams and layers.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Extract implementation details out of the business logic.
Develop software being agnostic of the Framework or the Runtime used.
Implementation details are provided using the dependency injector and
your business logic does not depend on it.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
The dependency container provide us different configurations to provide
dependencies:
● Singletons.
● Lazy Initialization.
● Provided dependencies.
● Named dependencies.
● Override dependencies already configured.
● Custom qualifiers.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Singletons
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Lazy Initialization
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Provided dependencies
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Named Dependencies
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
What can I do?
Custom Qualifiers
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Scoped Graphs
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Scoped Graphs
Dependencies provided by the Dependency Container or Object Graph
inside the Application class are linked to the Application lifecycle.
We need more than one graph to improve the Dependency Injector usage
and performance.
At the same time, some dependencies are needed just when some
components like Activities or Custom Views are initialized.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Scoped Graphs
Application Graph
Activity A
Graph
Activity B
Graph
Create Activity A
Create Activity B
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Step 1. Add Dagger and Dagger Compiler as dependencies:
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Step 2. Create an Application extension and configure the Object Graph:
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Step 3. Configure Dagger Modules:
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Step 4. Initialize your Application Object Graph:
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Step 5. Create a method to extend the Application Object Graph:
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger on Android
Step 6. Create a BaseActivity with the code needed to extend the
Application Graph.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Step 7. Create an abstract method requesting the Activity modules:
Dagger on Android
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Step 8. Extend the Application Object Graph using the Activity modules:
Dagger on Android
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
https://www.github.com/pedrovgs/EffectiveAndroidUI
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Can you repeat, please?
Dependency Injection on Android Workshop
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger 2
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Dagger 2
● Configuration based on components not in graphs.
● Generated code is now something you can read.
● Reflection free.
● 13 % faster.
● Full graph validated in build time.
Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
Questions?

Dependency injection on Android

  • 1.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Injection on Android Pedro Vicente Gómez Sánchez Senior Android Developer at Karumi pedro@karumi.com @pedro_g_s github.com/pedrovgs
  • 2.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs
  • 3.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Alberto Gragera Technical Director Jorge Barroso Senior Android Developer Davide Mendolia Senior Full Stack Engineer Sergio Gutierrez Senior Full Stack Engineer
  • 4.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Agenda ● Introduction. ● What can I do using Dependency Injection? ● Scoped Graphs. ● Dagger on Android. ● Dagger 2.
  • 5.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Introduction Inversion of Control vs Dependency Inversion vs Dependency Injection
  • 6.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Inversion of Control The natural evolution of the structured and imperative programming and the usage of reusable frameworks. The execution point where you software takes the control is not defined by your software.
  • 7.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Inversion One of the most important S.O.L.I.D principles. Depend on abstractions, forget about implementation details. Provide implementation details depending on abstractions can be tedious.
  • 8.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Injection Software Design Pattern used to facilitate the usage of Dependency Inversion. Provides dependencies given some previous configuration where abstractions are linked with concretions.
  • 9.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Why? The usage of IoC, Dependency Inversion and Dependency Injection provides give us the following benefits: ● Testability. ● Decoupling. ● Modularity.
  • 10.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Show me the code!
  • 11.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Injection Example The presenter inside this fragment has to be instantiated with all the dependency tree. Without a dependency injector this can be tedious.
  • 12.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Injection Example All the dependencies are passed in construction.
  • 13.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Injection Example The implementation details are part of the Dependency Injector configuration.
  • 14.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dependency Injection Example Now the Presenter is injected into the Fragment.
  • 15.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do with a Dependency Injector?
  • 16.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? ● Do not link the class to the runtime lifecycle or frameworks. ● Improve testability. ● Decouple your code and improve our software design. ● Detect code smells related to class dependencies and SRP violations. ● Change the implementation details in build time. ● Extract implementation details out of the business logic.
  • 17.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Do not link the class to the runtime lifecycle.
  • 18.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Improve testability.
  • 19.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Detect code smells related to class dependencies and single responsibility principle violations.
  • 20.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Change the implementation details in build time.
  • 21.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Decouple your code and improve our software design. Using a Dependency Injector combined with the correct usage of Dependency Inversion we can easily develop the same feature at the same time in different teams and layers.
  • 22.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Extract implementation details out of the business logic. Develop software being agnostic of the Framework or the Runtime used. Implementation details are provided using the dependency injector and your business logic does not depend on it.
  • 23.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? The dependency container provide us different configurations to provide dependencies: ● Singletons. ● Lazy Initialization. ● Provided dependencies. ● Named dependencies. ● Override dependencies already configured. ● Custom qualifiers.
  • 24.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Singletons
  • 25.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Lazy Initialization
  • 26.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Provided dependencies
  • 27.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Named Dependencies
  • 28.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs What can I do? Custom Qualifiers
  • 29.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Scoped Graphs
  • 30.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Scoped Graphs Dependencies provided by the Dependency Container or Object Graph inside the Application class are linked to the Application lifecycle. We need more than one graph to improve the Dependency Injector usage and performance. At the same time, some dependencies are needed just when some components like Activities or Custom Views are initialized.
  • 31.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Scoped Graphs Application Graph Activity A Graph Activity B Graph Create Activity A Create Activity B
  • 32.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android
  • 33.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android Step 1. Add Dagger and Dagger Compiler as dependencies:
  • 34.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android Step 2. Create an Application extension and configure the Object Graph:
  • 35.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android Step 3. Configure Dagger Modules:
  • 36.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android Step 4. Initialize your Application Object Graph:
  • 37.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android Step 5. Create a method to extend the Application Object Graph:
  • 38.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger on Android Step 6. Create a BaseActivity with the code needed to extend the Application Graph.
  • 39.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Step 7. Create an abstract method requesting the Activity modules: Dagger on Android
  • 40.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Step 8. Extend the Application Object Graph using the Activity modules: Dagger on Android
  • 41.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs https://www.github.com/pedrovgs/EffectiveAndroidUI
  • 42.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Can you repeat, please? Dependency Injection on Android Workshop
  • 43.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger 2
  • 44.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Dagger 2 ● Configuration based on components not in graphs. ● Generated code is now something you can read. ● Reflection free. ● 13 % faster. ● Full graph validated in build time.
  • 45.
    Pedro V. GómezSánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs Questions?