Dependency
Injection com
Kotlin no Android
https://bit.ly/2Q0DTZB
Slide 2
Slide 2 text
Thais Aquino
Desenvolvedora Android no LuizaLabs desde 2014
https://medium.com/@thasaquino
https://twitter.com/thaisandrade_s
https://www.linkedin.com/in/thasaquino
https://medium.com/luizalabs
Slide 3
Slide 3 text
Inversão de dependência?
Injeção de dependência?... WTF?
Slide 4
Slide 4 text
O que é Inversão de Dependência
Componentes devem depender de abstrações
Abstrações não devem depender de implementações
Implementações devem depender de abstrações
Slide 5
Slide 5 text
Responsabilidade da criação da dependência
Slide 6
Slide 6 text
Provendo a dependência pelo construtor
Slide 7
Slide 7 text
Inversão de Dependência
Antes A classe RocketsInfrastructure era responsável pela criação da
instância do Retrofit e do Serviço de Rest
Agora A classe RocketsInfrastructure recebe uma instância através de seu
construtor
Podemos usar essa instância compartilhada em qualquer lugar de nossa
aplicação!
fetchLaunches()
fetchRockets()
fetchMission()
Slide 8
Slide 8 text
Beleza... e a Injeção de dependência onde entra?
Slide 9
Slide 9 text
O que é Injeção de Dependência?
Classes dependem umas das outras para executar alguma lógica.
Aplicando Injeção de Dependência os objetos são fornecidos por uma
entidade externa que coordena cada objeto
As dependências são injetadas nos objetos!
Slide 10
Slide 10 text
Quem fornece a dependência? Factory?
Slide 11
Slide 11 text
No exemplo nosso Factory fornece a dependência
Mas podemos usar algum framework de DI para isso!
Quem fornece a dependência?
Slide 12
Slide 12 text
Porque usar framework?
Slide 13
Slide 13 text
Porque usar framework?
Para criar e prover as dependências
Separar implementação e inicialização do uso de
dependências
Escrever menos código
Reuso das dependências
Uso de escopo
Pode mockar as dependências injetadas
Testar fica mais fácil!
Slide 14
Slide 14 text
Nosso exemplo - Listagem de foguetes Space X
Networking
monta nosso Service do Retrofit
Source
depende de Networking para fazer o get na API da SpaceX buscando os
rockets
Presenter
depende do Source para buscar os Rockets e conversar com a View para
exibir os estados corretos da tela
https://api.spacexdata.com/v2/rockets/
Slide 15
Slide 15 text
Dagger 2
Código gerado a partir de Annotation Processor
Falha em tempo de compilação
Não usa reflection
É verbosa e difícil de entender
Slide 16
Slide 16 text
Dagger 2 no Android com Kotlin
plugin para usar o Annotation Processor do Kotlin
apply plugin: 'kotlin-kapt'
dependências
implementation 'com.google.dagger:dagger:2.17'
kapt 'com.google.dagger:dagger-compiler:2.17'
implementation 'com.google.dagger:dagger-android:2.17'
implementation 'com.google.dagger:dagger-android-support:2.17'
kapt 'com.google.dagger:dagger-android-processor:2.17'
Slide 17
Slide 17 text
Dagger 2 - módulo provendo networking
Slide 18
Slide 18 text
Dagger 2 - módulos provendo source e presenter
Slide 19
Slide 19 text
Dagger 2 - módulo provendo activity
Slide 20
Slide 20 text
Dagger 2 - component
Slide 21
Slide 21 text
Dagger 2 - application
Slide 22
Slide 22 text
Dagger 2 - activity
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
Kodein
Escrito em Kotlin
Container para fornecer as dependências
inline functions e lambda
extension functions
DSL
Menos verboso que Dagger
Falha no runtime
DI or … not DI??
“dependency retrieval container”
https://www.reddit.com/r/androiddev/comments/75g2fm/opinions_on_kodein/
Slide 31
Slide 31 text
Exemplo como DI
Slide 32
Slide 32 text
Exemplo como Service Locator
Slide 33
Slide 33 text
DI x SL
Ambos:
Infrastructure não é responsável pela dependência
Remoção do acoplamento da Infrastructure com Networking
Service Locator:
Agrega dependência do framework, que não é realmente necessária
Slide 34
Slide 34 text
implementation 'org.koin:koin-android:1.0.0-RC-3'
Slide 35
Slide 35 text
Koin
Escrito em Kotlin
Container
Inline functions
Extension functions
DSL
Menos verboso que Dagger
Falha no runtime
Architecture Components