Dependency injection on Android - Spanish

45
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs Dependency Injection on Android Pedro Vicente Gómez Sánchez Senior Android Developer at Karumi [email protected] @pedro_g_s github.com/pedrovgs

description

Slides used during the talk "Dependency Injection on Android". The Evnt workshop 2014

Transcript of Dependency injection on Android - Spanish

Page 1: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dependency Injection on AndroidPedro Vicente Gómez SánchezSenior Android Developer at Karumi

[email protected]@pedro_g_sgithub.com/pedrovgs

Page 2: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Page 3: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Alberto GrageraTechnical Director

Jorge BarrosoSenior Android Developer

Davide MendoliaSenior Full Stack Engineer

Sergio GutierrezSenior Full Stack Engineer

Page 4: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Agenda● Introduction.

● What can I do using Dependency Injection?

● Scoped Graphs.

● Dagger on Android.

● Dagger 2.

Page 5: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

IntroductionInversion of Control

vs

Dependency Inversion

vs

Dependency Injection

Page 6: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 7: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 8: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 9: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 10: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Show me the code!

Page 11: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 12: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dependency Injection Example

All the dependencies are passed in construction.

Page 13: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dependency Injection Example

The implementation details are part of the Dependency Injector configuration.

Page 14: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dependency Injection Example

Now the Presenter is injected into the Fragment.

Page 15: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do with a Dependency Injector?

Page 16: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 17: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Do not link the class to the runtime lifecycle.

Page 18: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Improve testability.

Page 19: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Detect code smells related to class dependencies and single responsibility principle violations.

Page 20: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Change the implementation details in build time.

Page 21: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 22: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 23: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 24: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Singletons

Page 25: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Lazy Initialization

Page 26: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Provided dependencies

Page 27: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Named Dependencies

Page 28: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

What can I do?Custom Qualifiers

Page 29: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Scoped Graphs

Page 30: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 31: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Scoped Graphs

Application Graph

Activity A Graph

Activity B Graph

Create Activity A

Create Activity B

Page 32: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on Android

Page 33: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on AndroidStep 1. Add Dagger and Dagger Compiler as dependencies:

Page 34: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on AndroidStep 2. Create an Application extension and configure the Object Graph:

Page 35: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on AndroidStep 3. Configure Dagger Modules:

Page 36: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on AndroidStep 4. Initialize your Application Object Graph:

Page 37: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on AndroidStep 5. Create a method to extend the Application Object Graph:

Page 38: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger on AndroidStep 6. Create a BaseActivity with the code needed to extend the

Application Graph.

Page 39: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Step 7. Create an abstract method requesting the Activity modules:

Dagger on Android

Page 40: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Step 8. Extend the Application Object Graph using the Activity modules:

Dagger on Android

Page 41: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

https://www.github.com/pedrovgs/EffectiveAndroidUI

Page 42: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Can you repeat, please?

Dependency Injection on Android Workshop

Page 43: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Dagger 2

Page 44: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @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.

Page 45: Dependency injection on Android - Spanish

Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs

Questions?