Upgrade to Pro — share decks privately, control downloads, hide ads and more …

android-multi-module-with-dagger

 android-multi-module-with-dagger

DroidKaigi2019
Day 01 11:20~
「マルチモジュールプロジェクトでの Dagger2を用いた Dependency Injection」
での発表資料です

サンプルコード
https://github.com/kgmyshin/Multi-Module-Project-With-Dagger

Shinnosuke Kugimiya

February 07, 2019
Tweet

More Decks by Shinnosuke Kugimiya

Other Decks in Programming

Transcript

  1. X
    © DMM.com
    w %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    w %BHHFS࠶ೖ໳
    w %BHHFSͷ"OESPJEαϙʔτ࠶ೖ໳
    w γϯάϧϞδϡʔϧͰͷ%BHHFSΛ༻͍ͨ%FQFOEFODZ*OKFDUJPO
    w ϚϧνϞδϡʔϧͰͷ%FQFOEFODZ*OKFDUJPOͷਏ͞
    w %BHHFSΛ࢖ͬͯϚϧνϞδϡʔϧϓϩδΣΫτͰ%*Λ࣮ݱ͢Δ
    w %ZOBNJD'FBUVSF.PEVMF͕͋Δ࣌ͷ࿩ʢ͕࣌ؒ͋Ε͹ʣ
    "HFOEB
    ΰʔϧ
    ϚϧνϞδϡʔϧͰߏ੒͞ΕͨϓϩδΣΫτͰɺ
    %BHHFSΛ༻͍ͨ%FQFOEFODZ*OKFDUJPOΛߦ͏ࡍͷ
    ೰ΈϙΠϯτΛ஌ΓɺͦͷղܾࡦΛཧղ͢Δɻ

    View Slide

  2. !LHNZTIJO
    %SPJE,BJHJ
    ϚϧνϞδϡʔϧϓϩδΣΫτͰͷ
    %BHHFSΛ༻͍ͨ
    %FQFOEFODZ*OKFDUJPO

    View Slide

  3. X
    © DMM.com
    ࣗݾ঺հ
    w LHNZTIJOఝٶʢ͗͘Έ΍ʣ
    w "OESPJEΤϯδχΞ
    w ߹ಉձࣾ%..DPN$50ࣨॴଐ

    View Slide

  4. X
    © DMM.com
    ͜ͷηογϣϯͷΰʔϧ

    View Slide

  5. X
    © DMM.com
    ͜ͷηογϣϯͷΰʔϧ
    ϚϧνϞδϡʔϧͰߏ੒͞ΕͨϓϩδΣΫτͰɺ
    %BHHFSΛ༻͍ͨ%FQFOEFODZ*OKFDUJPOΛߦ͏ࡍͷ
    ೰ΈϙΠϯτΛ஌ΓɺͦͷղܾࡦΛཧղ͢Δɻ

    View Slide

  6. X
    © DMM.com
    BHFOEB

    View Slide

  7. X
    © DMM.com
    BHFOEB
    w %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    w %BHHFS࠶ೖ໳
    w %BHHFSͷ"OESPJEαϙʔτ࠶ೖ໳
    w γϯάϧϞδϡʔϧͰͷ%BHHFSΛ༻͍ͨ%FQFOEFODZ*OKFDUJPO
    w ϚϧνϞδϡʔϧͰͷ%FQFOEFODZ*OKFDUJPOͷਏ͞
    w %BHHFSΛ࢖ͬͯϚϧνϞδϡʔϧϓϩδΣΫτͰ%*Λ࣮ݱ͢Δ
    w %ZOBNJD'FBUVSF.PEVMF͕͋Δ࣌ͷ࿩

    View Slide

  8. X
    © DMM.com
    ൃදʹೖΔલʹ
    ΋͠ηογϣϯΛฉ͍ͯΔதͰɺ
    Θ͔Βͳ͍ͱ͜ΖͳͲͰ͖ͯ·ͨ͠Βɺ
    ͥͻ%..DPNͷϒʔε·Ͱ͓ӽ͍ͩ͘͠͞ʂ

    View Slide

  9. X
    © DMM.com
    %FQFOEFODZ*OKFDUJPOͱ͸

    View Slide

  10. X
    © DMM.com
    %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    ҰݴͰɻ
    ʮґଘΦϒδΣΫτʯΛʮ஫ೖʯ͢ΔσβΠϯύλʔϯͰ͢ɻ

    View Slide

  11. X
    © DMM.com
    %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    internal class AllergenRepositoryImpl
    : AllergenRepository {
    private val apiClient = ApiClient()
    override fun findAll(
    ): Single> =
    apiClient.getAllergens()
    override fun findById(
    allergenId: AllergenId
    ): Maybe =
    apiClient.getAllergen(allergenId.value)
    }
    %*͠ͳ͍

    View Slide

  12. X
    © DMM.com
    %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    internal class AllergenRepositoryImpl @Inject
    constructor(
    private val apiClient: ApiClient
    ) : AllergenRepository {
    override fun findAll(
    ): Single> =
    apiClient.getAllergens()
    override fun findById(
    allergenId: AllergenId
    ): Maybe =
    apiClient.getAllergen(allergenId.value)
    }
    internal class AllergenRepositoryImpl
    : AllergenRepository {
    private val apiClient = ApiClient()
    override fun findAll(
    ): Single> =
    apiClient.getAllergens()
    override fun findById(
    allergenId: AllergenId
    ): Maybe =
    apiClient.getAllergen(allergenId.value)
    }
    %*͠ͳ͍ %*͢Δ

    View Slide

  13. X
    © DMM.com
    %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    internal class AllergenRepositoryImpl @Inject
    constructor(
    private val apiClient: ApiClient
    ) : AllergenRepository {
    override fun findAll(
    ): Single> =
    apiClient.getAllergens()
    override fun findById(
    allergenId: AllergenId
    ): Maybe =
    apiClient.getAllergen(allergenId.value)
    }
    internal class AllergenRepositoryImpl
    : AllergenRepository {
    private val apiClient = ApiClient()
    override fun findAll(
    ): Single> =
    apiClient.getAllergens()
    override fun findById(
    allergenId: AllergenId
    ): Maybe =
    apiClient.getAllergen(allergenId.value)
    }
    %*͠ͳ͍ %*͢Δ

    View Slide

  14. X
    © DMM.com
    %FQFOEFODZ*OKFDUJPOͱ͸ʢ؆୯ʹʣ
    ϝϦοτ
    w ݁߹͕ૄʹͳΔ
    w ୯ମςετ͕͠΍͍͢
    w ಛఆͷϥΠϒϥϦ΍ϑϨʔϜϫʔΫ΁ͷґଘ౓ΛԼ͛Δ͜ͱ͕Ͱ
    ͖Δ

    View Slide

  15. X
    © DMM.com
    ಛఆͷϥΠϒϥϦ΍ϑϨʔϜϫʔΫ΁ͷґଘ౓ΛԼ͛Δ͜ͱ͕Ͱ͖Δ
    w 7PMMFZPS3FUSPpUPS,UPS$MJFOU
    w 1JDBTTPPS(MJEF
    ͳͲͳͲͷґଘ౓Λ۩৅Օॴʹด͡ࠐΊΔ͜ͱͰɺ༰қʹϥΠϒ
    ϥϦΛ੾Γସ͑Δ͜ͱ͕Ͱ͖Δɻ

    View Slide

  16. X
    © DMM.com
    ΑΓ͔ͬ͠Γ஌Γ͍ͨํ͸ʜ
    %BZdࠓ೔͔Β࢝ΊΔґଘੑͷ஫ೖCZLPCBLFJTBO

    View Slide

  17. X
    © DMM.com
    %BHHFS࠶ೖ໳

    View Slide

  18. X
    © DMM.com
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸ʁ

    View Slide

  19. X
    © DMM.com
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸ʁ

    View Slide

  20. X
    © DMM.com
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸ʁ

    View Slide

  21. X
    © DMM.com
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸ʁ

    View Slide

  22. X
    © DMM.com
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸ʁ

    View Slide

  23. X
    © DMM.com
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸ʁ
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ

    View Slide

  24. X
    © DMM.com
    %BHHFSͰ͸
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ

    View Slide

  25. X
    © DMM.com
    %BHHFSͰ͸
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ

    View Slide

  26. X
    © DMM.com
    %BHHFSͰ͸
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ

    View Slide

  27. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  28. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  29. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    )PHFܕͷΠϯελϯεΛ͍ͩ͘͞
    IPHFΛͲ͏ͧ
    ʮͳʹΛఏڙ͢Δ͔ʁʯܕͱΠϯελϯεͷඥ෇͚Λߦ͏

    View Slide

  30. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class GreetingModule {
    @Binds
    abstract fun provideGreeter(impl: GreeterImpl): Greeter
    }
    @Module
    internal class CounterModule {
    @Singleton
    @Provides
    fun provideCounter(): Counter = CounterImpl()
    }
    .PEVMFͷॻ͖ํͷྫܕͱΠϯελϯεͷඥ෇͚Λߦ͏

    View Slide

  31. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class GreetingModule {
    @Binds
    abstract fun provideGreeter(impl: GreeterImpl): Greeter
    }
    @Module
    internal class CounterModule {
    @Singleton
    @Provides
    fun provideCounter(): Counter = CounterImpl()
    }
    .PEVMFͷॻ͖ํͷྫܕͱΠϯελϯεͷඥ෇͚Λߦ͏

    View Slide

  32. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class GreetingModule {
    @Binds
    abstract fun provideGreeter(impl: GreeterImpl): Greeter
    }
    @Module
    internal class CounterModule {
    @Singleton
    @Provides
    fun provideCounter(): Counter = CounterImpl()
    }
    .PEVMFͷॻ͖ํͷྫܕͱΠϯελϯεͷඥ෇͚Λߦ͏

    View Slide

  33. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class GreetingModule {
    @Binds
    abstract fun provideGreeter(impl: GreeterImpl): Greeter
    }
    @Module
    internal class CounterModule {
    @Singleton
    @Provides
    fun provideCounter(): Counter = CounterImpl()
    }
    .PEVMFͷॻ͖ํͷྫ

    View Slide

  34. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class GreetingModule {
    @Binds
    abstract fun provideGreeter(impl: GreeterImpl): Greeter
    }
    @Module
    internal class CounterModule {
    @Singleton
    @Provides
    fun provideCounter(): Counter = CounterImpl()
    }
    .PEVMFͷॻ͖ํͷྫܕͱΠϯελϯεͷඥ෇͚Λߦ͏

    View Slide

  35. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  36. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  37. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ

    View Slide

  38. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ
    $PNQPOFOUʹ͸ʮͳʹΛఏڙ͢Δ͔ʯҎ֎Λॻ͘

    View Slide

  39. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    ΞϓϦέʔγϣϯͰ%*Λ࣮ݱ͢Δʹ͸
    Ͳ͜ʹɹͳʹΛ
    *OKFDU͢Δ͔Λ໢ཏ͢Δඞཁ͕͋Δɻ
    $PNQPOFOUʹ͸ʮͳʹΛఏڙ͢Δ͔ʯҎ֎Λॻ͘
    ʮͲ͜ʹఏڙ͢Δ͔ʯΛओʹॻ͘

    View Slide

  40. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(modules = [GreetingModule::class])
    interface GreetingComponent {
    fun inject(activity: GreetingActivity)
    fun inject(fragment: GreetingFragment)
    fun greeter(): Greeter
    }
    $PNQPOFOUͷॻ͖ํͷྫJOKFDUઌΛҾ਺ʹͨؔ͠਺Λఆٛ͢Δ

    View Slide

  41. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(modules = [GreetingModule::class])
    interface GreetingComponent {
    fun inject(activity: GreetingActivity)
    fun inject(fragment: GreetingFragment)
    fun greeter(): Greeter
    }
    $PNQPOFOUͷॻ͖ํͷྫJOKFDUઌΛҾ਺ʹͨؔ͠਺Λఆٛ͢Δ

    View Slide

  42. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(modules = [GreetingModule::class])
    interface GreetingComponent {
    fun inject(activity: GreetingActivity)
    fun inject(fragment: GreetingFragment)
    fun greeter(): Greeter
    }
    $PNQPOFOUͷॻ͖ํͷྫJOKFDUઌΛҾ਺ʹͨؔ͠਺Λఆٛ͢Δ

    View Slide

  43. X
    © DMM.com
    ᶄ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(modules = [GreetingModule::class])
    interface GreetingComponent {
    fun inject(activity: GreetingActivity)
    fun inject(fragment: GreetingFragment)
    fun greeter(): Greeter
    }
    $PNQPOFOUͷॻ͖ํͷྫJOKFDUઌΛҾ਺ʹͨؔ͠਺Λఆٛ͢Δ

    View Slide

  44. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  45. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  46. X
    © DMM.com
    ᶅ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    class Application : android.app.Application(){
    lateinit var appComponent: AppComponent
    override fun onCreate() {
    super.onCreate()
    appComponent = DaggerAppComponent.create()
    }
    }

    View Slide

  47. X
    © DMM.com
    ᶅ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    class Application : android.app.Application(){
    lateinit var appComponent: AppComponent
    override fun onCreate() {
    super.onCreate()
    appComponent = DaggerAppComponent.create()
    }
    }

    View Slide

  48. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  49. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  50. X
    © DMM.com
    ᶆ֤ॴͰ*OKFDU͢Δ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    super.onAttach(context)
    (requireActivity().application as Application)
    .appComponent.inject(this)
    }
    :
    }

    View Slide

  51. X
    © DMM.com
    ᶆ֤ॴͰ*OKFDU͢Δ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    super.onAttach(context)
    (requireActivity().application as Application)
    .appComponent.inject(this)
    }
    :
    }

    View Slide

  52. X
    © DMM.com
    ᶆ֤ॴͰ*OKFDU͢Δ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    super.onAttach(context)
    (requireActivity().application as Application)
    .appComponent.inject(this)
    }
    :
    }

    View Slide

  53. X
    © DMM.com
    %BHHFSͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ
    ˞ɹखॱ̏͸৔߹ʹΑΔ͕ɺ͜͜Ͱ͸؆ུԽͷͨΊʹ͜ͷखॱʹݻఆ͢Δ
    ˞ɹҎ߱ͷྫͰ͸'SBHNFOU΁ͷ*OKFDUΛର৅ͱ͍ͯ͠Δ͕ɺଞͷΫϥεʹஔ͖׵͑ͯ΋໰୊ͳ͍

    View Slide

  54. X
    © DMM.com
    %BHHFS"OESPJE࠶ೖ໳

    View Slide

  55. X
    © DMM.com
    %BHHFS"OESPJEͷϞνϕʔγϣϯ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    super.onAttach(context)
    (requireActivity().application as Application)
    .appComponent.inject(this)
    }
    :
    }

    View Slide

  56. X
    © DMM.com
    %BHHFS"OESPJEͷϞνϕʔγϣϯ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    super.onAttach(context)
    (requireActivity().application as Application)
    .appComponent.inject(this)
    }
    :
    } *OKFDU͞ΕΔଆ͕ɺ*OKFDUPSʹ͍ͭͯͷৄࡉΛ஌ͬͯ͠·͍ͬͯΔɻ

    View Slide

  57. X
    © DMM.com
    %BHHFS"OESPJEͷϞνϕʔγϣϯ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    super.onAttach(context)
    (requireActivity().application as Application)
    .appComponent.inject(this)
    }
    :
    } *OKFDU͞ΕΔଆ͕ɺ*OKFDUPSʹ͍ͭͯͷৄࡉΛ஌ͬͯ͠·͍ͬͯΔɻ
    Ͳ͜ʹ*OKFDUPS͕͋Δͷ͔ʁͲͷ*OKFDUPS͕ࣗ෼Λ*OKFDUͰ͖Δͷ͔ʁͳͲ

    View Slide

  58. X
    © DMM.com
    %BHHFS"OESPJEͷϞνϕʔγϣϯ
    class MainFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }
    :
    }
    ͜͏͢Ε͹ɺྑͦ͞͏

    View Slide

  59. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    %BHHFSΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  60. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ /FX

    $PNQPOFOUΛ༻ҙ͢Δ 6QEBUFE

    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ 6QEBUFE

    ֤ॴͰJOKFDU 6QEBUFE

    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  61. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  62. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  63. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    abstract class AppModule {
    @Binds
    abstract fun messageProvider(impl: MessageProviderImpl): MessageProvider
    }

    View Slide

  64. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  65. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  66. X
    © DMM.com
    ᶄ'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    @Module
    abstract class MainFragmentModule {
    @ContributesAndroidInjector
    abstract fun mainFragment(): MainFragment
    }

    View Slide

  67. X
    © DMM.com
    ᶄ'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    @Module
    abstract class MainFragmentModule {
    @ContributesAndroidInjector
    abstract fun mainFragment(): MainFragment
    }

    View Slide

  68. X
    © DMM.com
    ᶄ'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    @Module
    abstract class MainFragmentModule {
    @ContributesAndroidInjector
    abstract fun mainFragment(): MainFragment
    }

    View Slide

  69. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  70. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  71. X
    © DMM.com
    ᶅ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    AppModule::class,
    MainFragmentModule::class
    ]
    )
    interface AppComponent : AndroidInjector

    View Slide

  72. X
    © DMM.com
    ᶅ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    AppModule::class,
    MainFragmentModule::class
    ]
    )
    interface AppComponent : AndroidInjector

    View Slide

  73. X
    © DMM.com
    ᶅ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    AppModule::class,
    MainFragmentModule::class
    ]
    )
    interface AppComponent : AndroidInjector

    View Slide

  74. X
    © DMM.com
    ᶅ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    AppModule::class,
    MainFragmentModule::class
    ]
    )
    interface AppComponent : AndroidInjector

    View Slide

  75. X
    © DMM.com
    ᶅ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    AppModule::class,
    MainFragmentModule::class
    ]
    )
    interface AppComponent : AndroidInjector
    Ͳ͜ʹ*OKFDU͢Δ͔͸ɺ'SBHNFOU.PEVMF΍"OESPJE*OKFDUPSʹ
    ୅ସ͞ΕͯΔͷͰॻ͔ͳ͍

    View Slide

  76. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  77. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  78. X
    © DMM.com
    ᶆ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    class Application : android.app.Application(), HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector: DispatchingAndroidInjector
    override fun supportFragmentInjector(): AndroidInjector =
    dispatchingFragmentInjector
    override fun onCreate() {
    super.onCreate()
    DaggerAppComponent.create().inject(this)
    }
    }

    View Slide

  79. X
    © DMM.com
    ᶆ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    class Application : android.app.Application(), HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector: DispatchingAndroidInjector
    override fun supportFragmentInjector(): AndroidInjector =
    dispatchingFragmentInjector
    override fun onCreate() {
    super.onCreate()
    DaggerAppComponent.create().inject(this)
    }
    }

    View Slide

  80. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  81. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  82. X
    © DMM.com
    ᶇ֤ॴͰ*OKFDU
    class MainFragment : Fragment() {
    @Inject
    lateinit var messageProvider: MessageProvider
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  83. X
    © DMM.com
    ᶇ֤ॴͰ*OKFDU
    class MainFragment : Fragment() {
    @Inject
    lateinit var messageProvider: MessageProvider
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  84. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    EBHHFSBOESPJEΛ࢖࣮ͬͨ૷ͷྲྀΕ

    View Slide

  85. X
    © DMM.com
    ࢓૊Έ
    $PNQPOFOU
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    w .BJO"DUJWJUZʹJOKFDU͢Δํ๏
    w 4VC"DUJWJUZʹJOKFDU͢Δํ๏

    View Slide

  86. X
    © DMM.com
    ࢓૊Έ
    $PNQPOFOU
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    w .BJO"DUJWJUZʹJOKFDU͢Δํ๏
    w 4VC"DUJWJUZʹJOKFDU͢Δํ๏
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    w .BJO"DUJWJUZʹJOKFDU͢Δํ๏
    w 4VC"DUJWJUZʹJOKFDU͢Δํ๏

    View Slide

  87. X
    © DMM.com
    ࢓૊Έ
    $PNQPOFOU
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    w .BJO"DUJWJUZʹJOKFDU͢Δํ๏
    w 4VC"DUJWJUZʹJOKFDU͢Δํ๏
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏

    View Slide

  88. X
    © DMM.com
    ࢓૊Έ
    $PNQPOFOU
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    w .BJO"DUJWJUZʹJOKFDU͢Δํ๏
    w 4VC"DUJWJUZʹJOKFDU͢Δํ๏
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector

    DaggerAppComponent.create().inject(this)

    }

    View Slide

  89. X
    © DMM.com
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    ࢓૊Έ
    $PNQPOFOU
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    w .BJO"DUJWJUZʹJOKFDU͢Δํ๏
    w 4VC"DUJWJUZʹJOKFDU͢Δํ๏
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏

    View Slide

  90. X
    © DMM.com
    ࢓૊Έ
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏

    View Slide

  91. X
    © DMM.com
    ࢓૊Έ
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }

    View Slide

  92. X
    © DMM.com
    ࢓૊Έ
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  93. X
    © DMM.com
    ࢓૊Έ
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  94. X
    © DMM.com
    ࢓૊Έ
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  95. X
    © DMM.com
    ࢓૊Έ
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏

    View Slide

  96. X
    © DMM.com
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    ࢓૊Έ
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  97. X
    © DMM.com
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w .BJO'SBHNFOUʹJOKFDU͢Δํ๏
    w 4VC'SBHNFOUʹJOKFDU͢Δํ๏
    ࢓૊Έ
    class MainFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  98. X
    © DMM.com
    ϚϧνϞδϡʔϧͷ%*Ͱͷਏ͞

    View Slide

  99. X
    © DMM.com
    ϚϧνϞδϡʔϧͰͷ%*
    BQQ
    DPVOUFS HSFFUJOH
    ͜͏͍͏΋ͷΛ࡞Δ

    View Slide

  100. X
    © DMM.com
    ϚϧνϞδϡʔϧͰͷ%*
    ͜͏͍͏΋ͷΛ࡞Δ
    BQQ
    DPVOUFS HSFFUJOH
    $PNQPOFOU͸ͦΕͧΕͰ࣋ͭ

    View Slide

  101. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ

    View Slide

  102. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ

    View Slide

  103. X
    © DMM.com
    ᶆ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()
    override fun supportFragmentInjector(): AndroidInjector =
    dispatchingFragmentInjector
    override fun onCreate() {
    super.onCreate()
    DaggerCounterComponent.create().inject(this)
    DaggerGreetingComponent.create().inject(this)

    }
    }

    View Slide

  104. X
    © DMM.com
    ᶆ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()
    override fun supportFragmentInjector(): AndroidInjector =
    dispatchingFragmentInjector
    override fun onCreate() {
    super.onCreate()
    DaggerCounterComponent.create().inject(this)
    DaggerGreetingComponent.create().inject(this)

    }
    }

    View Slide

  105. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ

    View Slide

  106. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ

    View Slide

  107. X
    © DMM.com
    ᶇ֤ॴͰ*OKFDU
    class CounterFragment : Fragment() {
    @Inject
    lateinit var counter: Counter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  108. X
    © DMM.com
    ᶇ֤ॴͰ*OKFDU
    class CounterFragment : Fragment() {
    @Inject
    lateinit var counter: Counter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  109. X
    © DMM.com
    Ͳ͏ͳΔ͔ʁ
    $PVOUFS'SBHNFOU (SFFUJOH'SBHNFOU

    View Slide

  110. X
    © DMM.com
    Ͳ͏ͳΔ͔ʁ
    $PVOUFS'SBHNFOU (SFFUJOH'SBHNFOU

    View Slide

  111. X
    © DMM.com
    $PNQPOFOUΛॳظԽͷॱ൪ΛೖΕସ͑ͯΈΔͱ
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()
    override fun supportFragmentInjector(): AndroidInjector =
    dispatchingFragmentInjector
    override fun onCreate() {
    super.onCreate()
    DaggerCounterComponent.create().inject(this)
    DaggerGreetingComponent.create().inject(this)

    }
    }

    View Slide

  112. X
    © DMM.com
    $PNQPOFOUΛॳظԽͷॱ൪ΛೖΕସ͑ͯΈΔͱ
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()
    override fun supportFragmentInjector(): AndroidInjector =
    dispatchingFragmentInjector
    override fun onCreate() {
    super.onCreate()
    DaggerGreetingComponent.create().inject(this)
    DaggerCounterComponent.create().inject(this)

    }
    }

    View Slide

  113. X
    © DMM.com
    Ͳ͏ͳΔ͔ʁ
    $PVOUFS'SBHNFOU (SFFUJOH'SBHNFOU

    View Slide

  114. X
    © DMM.com
    $SBTI͢Δཧ༝
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()

    override fun onCreate() {
    super.onCreate()
    DaggerCounterComponent.create().inject(this)
    DaggerGreetingComponent.create().inject(this)

    }
    }

    View Slide

  115. X
    © DMM.com
    $SBTI͢Δཧ༝
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()

    override fun onCreate() {
    super.onCreate()
    DaggerCounterComponent.create().inject(this)
    DaggerGreetingComponent.create().inject(this)

    }
    }

    View Slide

  116. X
    © DMM.com
    $SBTI͢Δཧ༝
    class Application : HasSupportFragmentInjector, … {
    @Inject
    lateinit var dispatchingFragmentInjector DispatchingAndroidInjector()

    override fun onCreate() {
    super.onCreate()
    DaggerCounterComponent.create().inject(this)
    DaggerGreetingComponent.create().inject(this)

    }
    }

    View Slide

  117. X
    © DMM.com
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w (SFFUJOH'SBHNFOUʹJOKFDU͢Δํ๏
    ࢓૊Έ
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }

    View Slide

  118. X
    © DMM.com
    class Application : HasSupportFragmentInjector {
    @Inject
    lateinit var dispatchingFragmentInjector
    }
    w (SFFUJOH'SBHNFOUʹJOKFDU͢Δํ๏
    ࢓૊Έ
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }

    View Slide

  119. X
    © DMM.com
    %BHHFSΛ࢖ͬͯ
    ϚϧνϞδϡʔϧϓϩδΣΫτͰ
    %*Λ࣮ݱ͢Δ

    View Slide

  120. X
    © DMM.com
    վΊͯ՝୊ͱ͸ʁ
    ՝୊
    "QQMJDBUJPOʹ'SBHNFOU༻ͷ*OKFDUPSΛҰ͔ͭ࣋ͯ͠ͳ͍ͨΊ
    ʹɺ*OKFDUPS্͕ॻ͖͞Εͯ͠·͏͜ͱ

    View Slide

  121. X
    © DMM.com
    վΊͯ՝୊ͱ͸ʁ
    ՝୊
    "QQMJDBUJPOʹ'SBHNFOU༻ͷ*OKFDUPSΛҰ͔ͭ࣋ͯ͠ͳ͍ͨΊ
    ʹɺ*OKFDUPS্͕ॻ͖͞Εͯ͠·͏͜ͱ

    View Slide

  122. X
    © DMM.com
    վΊͯ՝୊ͱ͸ʁ
    ՝୊
    "QQMJDBUJPOʹ'SBHNFOU༻ͷ*OKFDUPSΛҰ͔ͭ࣋ͯ͠ͳ͍ͨΊ
    ʹɺ*OKFDUPS্͕ॻ͖͞Εͯ͠·͏͜ͱ

    View Slide

  123. X
    © DMM.com
    "QQMJDBUJPOͰ࣋ͭͭͷ'SBHNFOU*OKFDUPS͕ɺෳ਺ͷ*OKFDUPS
    Λ࣋ͭΑ͏ʹ͢Δ
    ղܾࡦͷҰͭ

    View Slide

  124. X
    © DMM.com
    ͭͷ*OKFDUPSͷதͰෳ਺ͷ*OKFDUPSΛ࣋ͭΑ͏ʹ͢Δ

    View Slide

  125. X
    © DMM.com
    ͭͷ*OKFDUPSͷதͰෳ਺ͷ*OKFDUPSΛ࣋ͭΑ͏ʹ͢Δ

    View Slide

  126. X
    © DMM.com
    ͭͷ*OKFDUPSͷதͰෳ਺ͷ*OKFDUPSΛ࣋ͭΑ͏ʹ͢Δ

    View Slide

  127. X
    © DMM.com
    ͭͷ*OKFDUPSͷதͰෳ਺ͷ*OKFDUPSΛ࣋ͭΑ͏ʹ͢Δ

    View Slide

  128. X
    © DMM.com
    class ModuleInjector : AndroidInjector {
    private val injectors = mutableListOf>()
    fun addInjector(injector: HasDispatchingInjector) {
    injectors.add(injector)
    }
    fun removeInjector(injector: HasDispatchingInjector) {
    injectors.remove(injector)
    }

    override fun inject(instance: T) {
    val wasInjected = injectors.any { it.dispatchingAndroidInjector().maybeInject(instance) }
    if (!wasInjected) {
    throw IllegalArgumentException("injection failed")
    }
    }
    }
    .PEVMF*OKFDUPS

    View Slide

  129. X
    © DMM.com
    class ModuleInjector : AndroidInjector {
    private val injectors = mutableListOf>()
    fun addInjector(injector: HasDispatchingInjector) {
    injectors.add(injector)
    }
    fun removeInjector(injector: HasDispatchingInjector) {
    injectors.remove(injector)
    }

    override fun inject(instance: T) {
    val wasInjected = injectors.any { it.dispatchingAndroidInjector().maybeInject(instance) }
    if (!wasInjected) {
    throw IllegalArgumentException("injection failed")
    }
    }
    }
    .PEVMF*OKFDUPS

    View Slide

  130. X
    © DMM.com
    class ModuleInjector : AndroidInjector {
    private val injectors = mutableListOf>()
    fun addInjector(injector: HasDispatchingInjector) {
    injectors.add(injector)
    }
    fun removeInjector(injector: HasDispatchingInjector) {
    injectors.remove(injector)
    }

    override fun inject(instance: T) {
    val wasInjected = injectors.any { it.dispatchingAndroidInjector().maybeInject(instance) }
    if (!wasInjected) {
    throw IllegalArgumentException("injection failed")
    }
    }
    }
    .PEVMF*OKFDUPS

    View Slide

  131. X
    © DMM.com
    class ModuleInjector : AndroidInjector {
    private val injectors = mutableListOf>()
    fun addInjector(injector: HasDispatchingInjector) {
    injectors.add(injector)
    }
    fun removeInjector(injector: HasDispatchingInjector) {
    injectors.remove(injector)
    }

    override fun inject(instance: T) {
    val wasInjected = injectors.any { it.dispatchingAndroidInjector().maybeInject(instance) }
    if (!wasInjected) {
    throw IllegalArgumentException("injection failed")
    }
    }
    }
    .PEVMF*OKFDUPS
    interface HasDispatchingInjector {
    fun dispatchingAndroidInjector(): DispatchingAndroidInjector
    }

    View Slide

  132. X
    © DMM.com
    class ModuleInjector : AndroidInjector {
    private val injectors = mutableListOf>()
    fun addInjector(injector: HasDispatchingInjector) {
    injectors.add(injector)
    }
    fun removeInjector(injector: HasDispatchingInjector) {
    injectors.remove(injector)
    }

    override fun inject(instance: T) {
    val wasInjected = injectors.any { it.dispatchingAndroidInjector().maybeInject(instance) }
    if (!wasInjected) {
    throw IllegalArgumentException("injection failed")
    }
    }
    }
    .PEVMF*OKFDUPS

    View Slide

  133. X
    © DMM.com
    class ModuleInjector : AndroidInjector {
    private val injectors = mutableListOf>()
    fun addInjector(injector: HasDispatchingInjector) {
    injectors.add(injector)
    }
    fun removeInjector(injector: HasDispatchingInjector) {
    injectors.remove(injector)
    }

    override fun inject(instance: T) {
    val wasInjected = injectors.any { it.dispatchingAndroidInjector().maybeInject(instance) }
    if (!wasInjected) {
    throw IllegalArgumentException("injection failed")
    }
    }
    }
    .PEVMF*OKFDUPS

    View Slide

  134. X
    © DMM.com
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ /FX

    $PNQPOFOUΛ༻ҙ͢Δ 6QEBUFE

    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ 6QEBUFE

    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ

    View Slide

  135. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  136. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  137. X
    © DMM.com
    ᶃ.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class CounterModule {
    @Singleton
    @Binds
    abstract fun provideCounter(impl: CounterImpl): Counter
    }
    @Module
    internal abstract class GreetingModule {
    @Binds
    abstract fun provideGreeter(impl: GreeterImpl): Greeter
    }

    View Slide

  138. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  139. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  140. X
    © DMM.com
    ᶄ'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    @Module
    internal abstract class GreetingFragmentModule {
    @ContributesAndroidInjector
    abstract fun greetingFragment(): GreetingFragment
    }
    @Module
    internal abstract class CounterFragmentModule {
    @ContributesAndroidInjector
    abstract fun counterFragment(): CounterFragment
    }

    View Slide

  141. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  142. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  143. X
    © DMM.com
    ᶅ*OKFDUPSΛ༻ҙ͢Δ
    class CounterInjector : HasDispatchingInjector {
    @Inject
    lateinit var supportFragmentInjector: DispatchingAndroidInjector
    override fun dispatchingAndroidInjector(): DispatchingAndroidInjector =
    supportFragmentInjector
    }
    class GreetingInjector : HasDispatchingInjector {
    @Inject
    lateinit var supportFragmentInjector: DispatchingAndroidInjector
    override fun dispatchingAndroidInjector(): DispatchingAndroidInjector =
    supportFragmentInjector
    }

    View Slide

  144. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  145. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  146. X
    © DMM.com
    ᶆ$PNQPOFOUΛ༻ҙ͢Δ
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    CounterModule::class,
    CounterFragmentModule::class])
    interface CounterComponent : AndroidInjector
    @Singleton
    @Component(
    modules = [
    AndroidInjectionModule::class,
    GreetingModule::class,
    GreetingFragmentModule::class])
    interface GreetingComponent : AndroidInjector

    View Slide

  147. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  148. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  149. X
    © DMM.com
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }

    View Slide

  150. X
    © DMM.com
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ

    View Slide

  151. X
    © DMM.com
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ

    View Slide

  152. X
    © DMM.com
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ

    View Slide

  153. X
    © DMM.com
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ

    View Slide

  154. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  155. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  156. X
    © DMM.com
    ᶈ֤ॴͰ*OKFDU
    class CounterFragment : Fragment() {
    @Inject
    lateinit var counter: Counter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  157. X
    © DMM.com
    ྲྀΕ

    View Slide

  158. X
    © DMM.com
    ྲྀΕ

    View Slide

  159. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }

    View Slide

  160. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }

    View Slide

  161. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }

    View Slide

  162. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }

    View Slide

  163. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  164. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  165. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  166. X
    © DMM.com
    ྲྀΕ
    class Application :
    …, HasSupportFragmentInjector {
    private val moduleFragmentInjector

    }
    class CounterFragment : Fragment() {
    ɹɹ…
    AndroidSupportInjection.inject(this)

    }
    class MainActivity : AppCompatActivity() {

    }
    HasSupportFragmentInjectorΛ࣮૷ͯ͠Δ͔ʁ

    View Slide

  167. X
    © DMM.com
    %ZOBNJD'FBUVSF.PEVMF

    View Slide

  168. X
    © DMM.com
    %ZOBNJD'FBUVSF.PEVMF͕͋Δ࣌ͷ%*
    BQQ
    DPVOUFS HSFFUJOH
    ͍··Ͱ

    View Slide

  169. X
    © DMM.com
    %ZOBNJD'FBUVSF.PEVMF͕͋Δ࣌ͷ%*
    BQQ
    DPVOUFS
    HSFFUJOH
    HSFFUJOHΛEZOBNJDGFBUVSFʹ
    BQQ
    DPVOUFS HSFFUJOH
    ͍··Ͱ

    View Slide

  170. X
    © DMM.com
    %ZOBNJD'FBUVSF.PEVMF͕͋Δ࣌ͷ%*
    BQQ
    DPVOUFS
    HSFFUJOH
    HSFFUJOHΛEZOBNJDGFBUVSFʹ
    BQQ
    DPVOUFS HSFFUJOH
    ͍··Ͱ

    View Slide

  171. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  172. X
    © DMM.com
    .PEVMFΛ༻ҙ͢Δ
    'SBHNFOU.PEVMFΛ༻ҙ͢Δ
    *OKFDUPSΛ༻ҙ͢Δ
    $PNQPOFOUΛ༻ҙ͢Δ
    "QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ
    ֤ॴͰJOKFDU
    ࠓ·Ͱͱಉ͡खॱͰɺEBHHFSBOESPJEΛ࢖࣮ͬͯ૷ͯ͠ΈΔ
    EBHHFSBOESPJEͰ%FQFOEFODZ*OKFDUJPO͢Δ NVMUJNPEVMF

    View Slide

  173. X
    © DMM.com
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }

    View Slide

  174. X
    © DMM.com
    ᶇ"QQMJDBUJPOPO$SFBUFͰ$PNQPOFOUΛॳظԽ͢Δ
    class Application : android.app.Application(), HasSupportFragmentInjector {
    private val fragmentInjector = ModuleInjector()
    override fun supportFragmentInjector(): AndroidInjector = fragmentInjector
    override fun onCreate() {
    super.onCreate()
    val counterInjector = CounterInjector()
    DaggerCounterComponent.create().inject(counterInjector)
    val greetingInjector = GreetingInjector()
    DaggerGreetingComponent.create().inject(greetingInjector)
    fragmentInjector.addInjector(counterInjector)
    fragmentInjector.addInjector(greetingInjector)
    }
    }

    View Slide

  175. X
    © DMM.com
    "QQMJDBUJPOPO$SFBUFҎ߱ͷద੾ͳλΠϛϯάͰ
    JOKFDUPSΛੜ੒ͯ͠ɺNPEVMF*OKFDUPSʹ௥Ճ͢Δ
    ղܾࡦͷҰͭ

    View Slide

  176. X
    © DMM.com
    "QQMJDBUJPOPO$SFBUFҎ߱ͷద੾ͳλΠϛϯάͰ
    JOKFDUPSΛੜ੒ͯ͠ɺNPEVMF*OKFDUPSʹ௥Ճ͢Δ
    ղܾࡦͷҰͭ

    View Slide

  177. X
    © DMM.com
    ͨͱ͑͹ɺ͜Μͳؔ਺Λ࡞Δ
    object GreetingInjection {
    fun inject(fragment: Fragment) {
    val application = fragment.requireActivity().application as Application
    if (application.moduleFragmentInjector.injectors().all { it !is GreetingInjector }) {
    val injector = GreetingInjector()
    val component =
    DaggerGreetingComponent.builder()
    .counter(application.counterComponent().counter())
    .build()
    component.inject(injector)
    application.addFragmentInjector(injector)
    }
    AndroidSupportInjection.inject(fragment)
    }
    }

    View Slide

  178. X
    © DMM.com
    ͨͱ͑͹ɺ͜Μͳؔ਺Λ࡞Δ
    object GreetingInjection {
    fun inject(fragment: Fragment) {
    val application = fragment.requireActivity().application as Application
    if (application.moduleFragmentInjector.injectors().all { it !is GreetingInjector }) {
    val injector = GreetingInjector()
    val component =
    DaggerGreetingComponent.builder()
    .counter(application.counterComponent().counter())
    .build()
    component.inject(injector)
    application.addFragmentInjector(injector)
    }
    AndroidSupportInjection.inject(fragment)
    }
    }

    View Slide

  179. X
    © DMM.com
    ͨͱ͑͹ɺ͜Μͳؔ਺Λ࡞Δ
    object GreetingInjection {
    fun inject(fragment: Fragment) {
    val application = fragment.requireActivity().application as Application
    if (application.moduleFragmentInjector.injectors().all { it !is GreetingInjector }) {
    val injector = GreetingInjector()
    val component =
    DaggerGreetingComponent.builder()
    .counter(application.counterComponent().counter())
    .build()
    component.inject(injector)
    application.addFragmentInjector(injector)
    }
    AndroidSupportInjection.inject(fragment)
    }
    }

    View Slide

  180. X
    © DMM.com
    ͨͱ͑͹ɺ͜Μͳؔ਺Λ࡞Δ
    object GreetingInjection {
    fun inject(fragment: Fragment) {
    val application = fragment.requireActivity().application as Application
    if (application.moduleFragmentInjector.injectors().all { it !is GreetingInjector }) {
    val injector = GreetingInjector()
    val component =
    DaggerGreetingComponent.builder()
    .counter(application.counterComponent().counter())
    .build()
    component.inject(injector)
    application.addFragmentInjector(injector)
    }
    AndroidSupportInjection.inject(fragment)
    }
    }

    View Slide

  181. X
    © DMM.com
    ͨͱ͑͹ɺ͜Μͳؔ਺Λ࡞Δ
    object GreetingInjection {
    fun inject(fragment: Fragment) {
    val application = fragment.requireActivity().application as Application
    if (application.moduleFragmentInjector.injectors().all { it !is GreetingInjector }) {
    val injector = GreetingInjector()
    val component =
    DaggerGreetingComponent.builder()
    .counter(application.counterComponent().counter())
    .build()
    component.inject(injector)
    application.addFragmentInjector(injector)
    }
    AndroidSupportInjection.inject(fragment)
    }
    } "DUJWJUZʹNPEVMF*OKFDUPS͕͋Δ৔߹Λߟྀͯ͠ɺ
    "OESPJE4VQQPSU*OKFDUJPOͱಉ͡Α͏ͳ࣮૷ʹ͢Δͷ΋Մ

    View Slide

  182. X
    © DMM.com
    ͨͱ͑͹ɺ͜Μͳؔ਺Λ࡞Δ
    object GreetingInjection {
    fun inject(fragment: Fragment) {
    val application = fragment.requireActivity().application as Application
    if (application.moduleFragmentInjector.injectors().all { it !is GreetingInjector }) {
    val injector = GreetingInjector()
    val component =
    DaggerGreetingComponent.builder()
    .counter(application.counterComponent().counter())
    .build()
    component.inject(injector)
    application.addFragmentInjector(injector)
    }
    AndroidSupportInjection.inject(fragment)
    }
    } ˞"DUJWJUZͰ*OKFDUPSΛ࣋ͭͱ͖͸͜ͷํ๏ͩͱ͏·͍͔͘ͳ͍ͷͰ
    ৚݅෼ذ͢Δඞཁ͕͋Γ·͢ʂ

    View Slide

  183. X
    © DMM.com
    ͦ͏͢ΔͱɺJOKFDUઌ͸͜ͷมߋ͚ͩͰࠓ·Ͱ௨Γಈ͘Α͏ʹͳΔ
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    GreetingInjection.inject(this)
    super.onAttach(context)
    }

    }
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  184. X
    © DMM.com
    ͦ͏͢ΔͱɺJOKFDUઌ͸͜ͷมߋ͚ͩͰࠓ·Ͱ௨Γಈ͘Α͏ʹͳΔ
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    GreetingInjection.inject(this)
    super.onAttach(context)
    }

    }
    class GreetingFragment : Fragment() {
    @Inject
    lateinit var greeter: Greeter
    override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
    }

    }

    View Slide

  185. X
    © DMM.com
    ࿩ͨ͜͠ͱৼΓฦΓ

    View Slide

  186. X
    © DMM.com
    ࿩ͨ͜͠ͱৼΓฦΓ
    w %FQFOEFODZ*OKFDUJPOͱ͸
    w %BHHFSͷ࢖͍ํͷҰྫɺखॱɺ࢓૊Έ
    w %BHHFS"OESPJEαϙʔτͷ࢖͍ํͷҰྫɺखॱɺ࢓૊Έ
    w ͦͷ··Ͱ͸ϚϧνϞδϡʔϧରԠͰ͖ͳ͍έʔε͕͋Δ͜ͱ
    w .PEVMF*OKFDUPSΛಋೖ͢Δ͜ͱͰରԠͰ͖Δ͜ͱ
    w %ZOBNJD'FBUVSF.PEVMF࣌͸ɺద੾ͳλΠϛϯάͰ*OKFDUPSΛ
    .PEVMF*OKFDUPSʹࠩ͠ࠐΜͰ͋͛Δඞཁ͕͋Δ͜ͱ

    View Slide

  187. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide