Slide 1

Slide 1 text

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

Slide 25

Slide 25 text

Kodein - dependências implementation 'org.kodein.di:kodein-di-generic-jvm:5.2.0' implementation 'org.kodein.di:kodein-di-framework-android-support:5.2.0'

Slide 26

Slide 26 text

Kodein - provendo networking

Slide 27

Slide 27 text

Kodein - provendo source e presenter

Slide 28

Slide 28 text

Kodein - iniciando o container na Application

Slide 29

Slide 29 text

Kodein - recuperando presenter na Activity

Slide 30

Slide 30 text

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

Slide 36

Slide 36 text

Koin - provendo networking

Slide 37

Slide 37 text

Koin - provendo source e presenter

Slide 38

Slide 38 text

Koin - application

Slide 39

Slide 39 text

Koin - activity

Slide 40

Slide 40 text

Exemplos Dagger https://github.com/tasaquino/spacex_di/tree/dagger-android Kodein https://github.com/tasaquino/spacex_di/tree/kodein-implemention Koin https://github.com/tasaquino/spacex_di/tree/koin-implementions

Slide 41

Slide 41 text

Links https://speakerdeck.com/thaisaquino/di-com-kotlin-no-android https://google.github.io/dagger/ https://insert-koin.io/ http://kodein.org/Kodein-DI/

Slide 42

Slide 42 text

Obrigada! :)