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

Dependency Injection with Dagger2

Dependency Injection with Dagger2

A short and simple presentation on Dagger2

Avatar for Kurt Renzo Acosta

Kurt Renzo Acosta

October 29, 2019

More Decks by Kurt Renzo Acosta

Other Decks in Technology

Transcript

  1. class MacBook { val battery: Battery = Battery() } class

    Battery fun main() { val myMacBook = MacBook() }
  2. class MacBook { val battery: Battery = Battery() } class

    Battery fun main() { val myMacBook = MacBook() }
  3. class MacBook (val battery: Battery) class Battery fun main() {

    val battery = Battery() val myMacBook = MacBook(battery) }
  4. class MacBook (val battery: Battery) class Battery fun main() {

    val battery = Battery() val myMacBook = MacBook(battery) }
  5. class MacBook (val battery: Battery) class Battery fun main() {

    val battery = Battery() val myMacBook = MacBook(battery) }
  6. class MacBook ( val battery: Battery, val keyboard: Keyboard, val

    trackpad: Trackpad, val screen: Screen ) class Battery class Keyboard class Trackpad class Screen fun main() { val keyboard = Keyboard() val trackpad = Trackpad() val screen = Screen() val battery = Battery() val myMacBook = MacBook(battery, keyboard, trackpad, screen) }
  7. fun main() { val keyboard = Keyboard() val trackpad =

    Trackpad() val screen = Screen() val battery = Battery() val myMacBook = MacBook(battery, keyboard, trackpad, screen) val keyboard2 = Keyboard() val trackpad2 = Trackpad() val screen2 = Screen() val battery2 = Battery() val myMacBook2 = MacBook(battery, keyboard, trackpad, screen) }
  8. object ServiceLocator { private val keyboard = Keyboard() private val

    trackpad = Trackpad() private val screen = Screen() private val battery = Battery() val myMacBook = MacBook(battery, keyboard, trackpad, screen) private val keyboard2 = Keyboard() private val trackpad2 = Trackpad() private val screen2 = Screen() private val battery2 = Battery() val myMacBook2 = MacBook(battery, keyboard, trackpad, screen) } fun main() { ServiceLocator.myMacBook ServiceLocator.myMacBook2 }
  9. class Application { fun onCreate() { startKoin { val macBookModule

    = module { factory { Battery() } factory { Keyboard() } factory { Screen() } factory { Trackpad() } single(named("macbook-1")) { MacBook(get(), get(), get(), get()) } single(named("macbook-2")) { MacBook(get(), get(), get(), get()) } } } } } class MyClass { val myMacbook by inject() val myMacbook2 by inject() }
  10. class Application { fun onCreate() { startKoin { val macBookModule

    = module { factory { Battery() } factory { Keyboard() } factory { Screen() } factory { Trackpad() } single(named("macbook-1")) { MacBook(get(), get(), get(), get()) } single(named("macbook-2")) { MacBook(get(), get(), get(), get()) } } } } } class MyClass { val myMacbook by inject() val myMacbook2 by inject() }
  11. class Application { fun onCreate() { startKoin { val macBookModule

    = module { factory { Battery() } factory { Keyboard() } factory { Screen() } factory { Trackpad() } single(named("macbook-1")) { MacBook(get(), get(), get(), get()) } single(named("macbook-2")) { MacBook(get(), get(), get(), get()) } } } } } class MyClass { val myMacbook by inject() val myMacbook2 by inject() }
  12. class Application { fun onCreate() { startKoin { val macBookModule

    = module { factory { Battery() } factory { Keyboard() } factory { Screen() } factory { Trackpad() } single(named("macbook-1")) { MacBook(get(), get(), get(), get()) } single(named("macbook-2")) { MacBook(get(), get(), get(), get()) } } } } } class MyClass { val myMacbook by inject() val myMacbook2 by inject() }
  13. class Application { fun onCreate() { startKoin { val macBookModule

    = module { factory { Battery() } factory { Keyboard() } factory { Screen() } factory { Trackpad() } single(named("macbook-1")) { MacBook(get(), get(), get(), get()) } single(named("macbook-2")) { MacBook(get(), get(), get(), get()) } } } } } class MyClass { val myMacbook by inject() val myMacbook2 by inject() }
  14. val kodein = Kodein { bind<Battery> with provider { Battery()

    } bind<Keyboard> with provider { Keyboard() } bind<Screen> with provider { Screen() } bind<Trackpad> with provider { Trackpad() } bind<MacBook>(tag = "macbook-1") with singleton { MacBook(get(), get(), get(), get()) } bind<MacBook>(tag = "macbook-2") with singleton { MacBook(get(), get(), get(), get()) } } class MyClass(val kodein: Kodein) { val myMacbook by kodein.instance() val myMacbook2 by kodein.instance() }
  15. val kodein = Kodein { bind<Battery> with provider { Battery()

    } bind<Keyboard> with provider { Keyboard() } bind<Screen> with provider { Screen() } bind<Trackpad> with provider { Trackpad() } bind<MacBook>(tag = "macbook-1") with singleton { MacBook(get(), get(), get(), get()) } bind<MacBook>(tag = "macbook-2") with singleton { MacBook(get(), get(), get(), get()) } } class MyClass(val kodein: Kodein) { val myMacbook by kodein.instance() val myMacbook2 by kodein.instance() }
  16. val kodein = Kodein { bind<Battery> with provider { Battery()

    } bind<Keyboard> with provider { Keyboard() } bind<Screen> with provider { Screen() } bind<Trackpad> with provider { Trackpad() } bind<MacBook>(tag = "macbook-1") with singleton { MacBook(get(), get(), get(), get()) } bind<MacBook>(tag = "macbook-2") with singleton { MacBook(get(), get(), get(), get()) } } class MyClass(val kodein: Kodein) { val myMacbook by kodein.instance() val myMacbook2 by kodein.instance() }
  17. val kodein = Kodein { bind<Battery> with provider { Battery()

    } bind<Keyboard> with provider { Keyboard() } bind<Screen> with provider { Screen() } bind<Trackpad> with provider { Trackpad() } bind<MacBook>(tag = "macbook-1") with singleton { MacBook(get(), get(), get(), get()) } bind<MacBook>(tag = "macbook-2") with singleton { MacBook(get(), get(), get(), get()) } } class MyClass(val kodein: Kodein) { val myMacbook by kodein.instance() val myMacbook2 by kodein.instance() }
  18. val kodein = Kodein { bind<Battery> with provider { Battery()

    } bind<Keyboard> with provider { Keyboard() } bind<Screen> with provider { Screen() } bind<Trackpad> with provider { Trackpad() } bind<MacBook>(tag = "macbook-1") with singleton { MacBook(get(), get(), get(), get()) } bind<MacBook>(tag = "macbook-2") with singleton { MacBook(get(), get(), get(), get()) } } class MyClass(val kodein: Kodein) { val myMacbook by kodein.instance() val myMacbook2 by kodein.instance() }
  19. class MacBook (val battery: Battery) class Battery fun main() {

    val battery = Battery() val myMacBook = MacBook(battery) }
  20. public final class Battery_Factory implements Factory<Battery> { private static final

    Battery_Factory INSTANCE = new Battery_Factory(); @Override public Battery get() { return new Battery(); } public static Battery_Factory create() { return INSTANCE; } public static Battery newInstance() { return new Battery(); } }
  21. public final class Battery_Factory implements Factory<Battery> { private static final

    Battery_Factory INSTANCE = new Battery_Factory(); @Override public Battery get() { return new Battery(); } public static Battery_Factory create() { return INSTANCE; } public static Battery newInstance() { return new Battery(); } }
  22. public final class MacBook_Factory implements Factory<MacBook> { private final Provider<Battery>

    batteryProvider; public MacBook_Factory(Provider<Battery> batteryProvider) { this.batteryProvider = batteryProvider; } @Override public MacBook get() { return new MacBook(batteryProvider.get()); } public static MacBook_Factory create(Provider<Battery> batteryProvider) { return new MacBook_Factory(batteryProvider); } public static MacBook newInstance(Battery battery) { return new MacBook(battery); } }
  23. public final class MacBook_Factory implements Factory<MacBook> { private final Provider<Battery>

    batteryProvider; public MacBook_Factory(Provider<Battery> batteryProvider) { this.batteryProvider = batteryProvider; } @Override public MacBook get() { return new MacBook(batteryProvider.get()); } public static MacBook_Factory create(Provider<Battery> batteryProvider) { return new MacBook_Factory(batteryProvider); } public static MacBook newInstance(Battery battery) { return new MacBook(battery); } }
  24. public final class DaggerMainComponent implements MainComponent { private DaggerMainComponent() {

    } public static Builder builder() { return new Builder(); } public static MainComponent create() { return new Builder().build(); } @Override public MacBook macbook() { return new MacBook(new Battery()); } public static final class Builder { private Builder() { } public MainComponent build() { return new DaggerMainComponent(); } } }
  25. public final class DaggerMainComponent implements MainComponent { private DaggerMainComponent() {

    } public static Builder builder() { return new Builder(); } public static MainComponent create() { return new Builder().build(); } @Override public MacBook macbook() { return new MacBook(new Battery()); } public static final class Builder { private Builder() { } public MainComponent build() { return new DaggerMainComponent(); } } }
  26. public final class DaggerMainComponent implements MainComponent { private DaggerMainComponent() {

    } public static Builder builder() { return new Builder(); } public static MainComponent create() { return new Builder().build(); } @Override public MacBook macbook() { return new MacBook(new Battery()); } public static final class Builder { private Builder() { } public MainComponent build() { return new DaggerMainComponent(); } } }
  27. @Component interface MainComponent { fun macbook(): MacBook } fun main()

    { val mainComponent = DaggerMainComponent.create() mainComponent.macbook() }
  28. @Component interface MainComponent { fun inject(main: Main) } class Main

    { @Inject lateinit var macbook: MacBook init { DaggerMainComponent.create().inject(this) } fun main() { // Use macbook here } }
  29. public final class DaggerMainComponent implements MainComponent { private DaggerMainComponent() {

    } public static Builder builder() { … } public static MainComponent create() { … } private MacBook getMacBook() { return new MacBook(new Battery()); } @Override public void inject(Main main) { injectMain(main); } private Main injectMain(Main instance) { Main_MembersInjector.injectMacbook(instance, getMacBook()); return instance; } public static final class Builder { … } }
  30. public final class DaggerMainComponent implements MainComponent { private DaggerMainComponent() {

    } public static Builder builder() { … } public static MainComponent create() { … } private MacBook getMacBook() { return new MacBook(new Battery()); } @Override public void inject(Main main) { injectMain(main); } private Main injectMain(Main instance) { Main_MembersInjector.injectMacbook(instance, getMacBook()); return instance; } public static final class Builder { … } }
  31. public final class Main_MembersInjector implements MembersInjector<Main> { private final Provider<MacBook>

    macbookProvider; public Main_MembersInjector(Provider<MacBook> macbookProvider) { this.macbookProvider = macbookProvider; } public static MembersInjector<Main> create(Provider<MacBook> macbookProvider) { return new Main_MembersInjector(macbookProvider); } @Override public void injectMembers(Main instance) { injectMacbook(instance, macbookProvider.get()); } public static void injectMacbook(Main instance, MacBook macbook) { instance.macbook = macbook; } }
  32. public final class Main_MembersInjector implements MembersInjector<Main> { private final Provider<MacBook>

    macbookProvider; public Main_MembersInjector(Provider<MacBook> macbookProvider) { this.macbookProvider = macbookProvider; } public static MembersInjector<Main> create(Provider<MacBook> macbookProvider) { return new Main_MembersInjector(macbookProvider); } @Override public void injectMembers(Main instance) { injectMacbook(instance, macbookProvider.get()); } public static void injectMacbook(Main instance, MacBook macbook) { instance.macbook = macbook; } }
  33. class MacBook @Inject constructor( val battery: Battery, val keyboard: Keyboard,

    val trackpad: Trackpad, val screen: Screen ) class Battery @Inject constructor() class Keyboard @Inject constructor() class Trackpad @Inject constructor() class Screen @Inject constructor() @Component interface MainComponent { fun inject(main: Main) } class Main { @Inject lateinit var macbook: MacBook init { DaggerMainComponent.create().inject(this) } fun main() { // Use macbook here } }
  34. class MacBook @Inject constructor( val battery: Battery, val keyboard: Keyboard,

    val trackpad: Trackpad, val screen: Screen ) class Battery @Inject constructor() class Keyboard @Inject constructor() class Trackpad @Inject constructor() class Screen @Inject constructor() @Component interface MainComponent { fun inject(main: Main) } class Main { @Inject lateinit var macbook: MacBook init { DaggerMainComponent.create().inject(this) } fun main() { // Use macbook here } }
  35. class MacBook @Inject constructor( val battery: Battery, val keyboard: Keyboard,

    val trackpad: Trackpad, val screen: Screen ) class Battery @Inject constructor() class Keyboard @Inject constructor() class Trackpad @Inject constructor() class Screen @Inject constructor() @Component interface MainComponent { fun inject(main: Main) } class Main { @Inject lateinit var macbook: MacBook init { DaggerMainComponent.create().inject(this) } fun main() { // Use macbook here } }
  36. class MacBook @Inject constructor( val battery: Battery, val keyboard: Keyboard,

    val trackpad: Trackpad, val screen: Screen ) class Battery @Inject constructor() class Keyboard @Inject constructor() class Trackpad @Inject constructor() class Screen @Inject constructor() @Component interface MainComponent { fun inject(main: Main) } class Main { @Inject lateinit var macbook: MacBook init { DaggerMainComponent.create().inject(this) } fun main() { // Use macbook here } }
  37. class MacBook @Inject constructor( val battery: Battery, val keyboard: Keyboard,

    val trackpad: Trackpad, val screen: Screen ) class Battery @Inject constructor() class Keyboard @Inject constructor() class Trackpad @Inject constructor() class Screen @Inject constructor() @Component interface MainComponent { fun inject(main: Main) } class Main { @Inject lateinit var macbook: MacBook init { DaggerMainComponent.create().inject(this) } fun main() { // Use macbook here } }
  38. interface Keyboard class ButterflyKeyboard @Inject constructor() : Keyboard class ScissorKeyboard

    @Inject constructor() : Keyboard class MacBook @Inject constructor(val keyboard: Keyboard)
  39. interface Keyboard class ButterflyKeyboard @Inject constructor() : Keyboard class ScissorKeyboard

    @Inject constructor() : Keyboard class MacBook @Inject constructor(val keyboard: Keyboard)
  40. [Dagger/MissingBinding] Keyboard cannot be provided without an @Provides-annotated method. public

    abstract interface MainComponent { ^ Keyboard is injected at MacBook(keyboard) MacBook is injected at Main.macbook Main is injected at MainComponent.inject(Main)
  41. interface Keyboard class ButterflyKeyboard @Inject constructor() : Keyboard class ScissorKeyboard

    @Inject constructor() : Keyboard class MacBook @Inject constructor(val keyboard: Keyboard)
  42. @Module class KeyboardModule { @Provides fun provideButterflyKeyboard(): Keyboard = ButterflyKeyboard()

    } @Component(modules = [KeyboardModule::class]) interface MainComponent { fun inject(main: Main) }
  43. @Module class KeyboardModule { @Provides fun provideButterflyKeyboard(): Keyboard = ButterflyKeyboard()

    } @Component(modules = [KeyboardModule::class]) interface MainComponent { fun inject(main: Main) }
  44. public final class KeyboardModule_ProvideButterflyKeyboardFactory implements Factory<Keyboard> { private final KeyboardModule

    module; public KeyboardModule_ProvideButterflyKeyboardFactory(KeyboardModule module) { this.module = module; } @Override public Keyboard get() { return provideButterflyKeyboard(module); } public static KeyboardModule_ProvideButterflyKeyboardFactory create(KeyboardModule module) { return new KeyboardModule_ProvideButterflyKeyboardFactory(module); } public static Keyboard provideButterflyKeyboard(KeyboardModule instance) { return Preconditions.checkNotNull(instance.provideButterflyKeyboard(), "Cannot return null from a non-@Nullable @Provides method"); } }
  45. public final class KeyboardModule_ProvideButterflyKeyboardFactory implements Factory<Keyboard> { private final KeyboardModule

    module; public KeyboardModule_ProvideButterflyKeyboardFactory(KeyboardModule module) { this.module = module; } @Override public Keyboard get() { return provideButterflyKeyboard(module); } public static KeyboardModule_ProvideButterflyKeyboardFactory create(KeyboardModule module) { return new KeyboardModule_ProvideButterflyKeyboardFactory(module); } public static Keyboard provideButterflyKeyboard(KeyboardModule instance) { return Preconditions.checkNotNull(instance.provideButterflyKeyboard(), "Cannot return null from a non-@Nullable @Provides method"); } }
  46. public final class KeyboardModule_ProvideButterflyKeyboardFactory implements Factory<Keyboard> { private final KeyboardModule

    module; public KeyboardModule_ProvideButterflyKeyboardFactory(KeyboardModule module) { this.module = module; } @Override public Keyboard get() { return provideButterflyKeyboard(module); } public static KeyboardModule_ProvideButterflyKeyboardFactory create(KeyboardModule module) { return new KeyboardModule_ProvideButterflyKeyboardFactory(module); } public static Keyboard provideButterflyKeyboard(KeyboardModule instance) { return Preconditions.checkNotNull(instance.provideButterflyKeyboard(), "Cannot return null from a non-@Nullable @Provides method"); } }
  47. public final class DaggerMainComponent implements MainComponent { private MacBook getMacBook()

    { return new MacBook( KeyboardModule_ProvideButterflyKeyboardFactory.provideButterflyKeyboard(keyboardModule) ); } public static final class Builder { private KeyboardModule keyboardModule; private Builder() {} public Builder keyboardModule(KeyboardModule keyboardModule) { this.keyboardModule = Preconditions.checkNotNull(keyboardModule); return this; } public MainComponent build() { if (keyboardModule == null) { this.keyboardModule = new KeyboardModule(); } return new DaggerMainComponent(keyboardModule); } } }
  48. public final class DaggerMainComponent implements MainComponent { private MacBook getMacBook()

    { return new MacBook( KeyboardModule_ProvideButterflyKeyboardFactory.provideButterflyKeyboard(keyboardModule) ); } public static final class Builder { private KeyboardModule keyboardModule; private Builder() {} public Builder keyboardModule(KeyboardModule keyboardModule) { this.keyboardModule = Preconditions.checkNotNull(keyboardModule); return this; } public MainComponent build() { if (keyboardModule == null) { this.keyboardModule = new KeyboardModule(); } return new DaggerMainComponent(keyboardModule); } } }
  49. public final class DaggerMainComponent implements MainComponent { private MacBook getMacBook()

    { return new MacBook( KeyboardModule_ProvideButterflyKeyboardFactory.provideButterflyKeyboard(keyboardModule) ); } public static final class Builder { private KeyboardModule keyboardModule; private Builder() {} public Builder keyboardModule(KeyboardModule keyboardModule) { this.keyboardModule = Preconditions.checkNotNull(keyboardModule); return this; } public MainComponent build() { if (keyboardModule == null) { this.keyboardModule = new KeyboardModule(); } return new DaggerMainComponent(keyboardModule); } } }
  50. class Main { @Inject lateinit var macbook: MacBook init {

    DaggerMainComponent .builder() .keyboardModule(KeyboardModule()) .build() .inject(this) } fun main() { // Use macbook here } }
  51. class Main { @Inject lateinit var macbook: MacBook init {

    DaggerMainComponent .builder() .keyboardModule(KeyboardModule()) .build() .inject(this) } fun main() { // Use macbook here } }
  52. class MacBook @Inject constructor( @Named("scissor") val keyboard: Keyboard ) @Module

    class KeyboardModule { @Provides fun provideButterflyKeyboard(): Keyboard = ButterflyKeyboard() @Provides @Named("scissor") fun provideScissorKeyboard(): Keyboard = ScissorKeyboard() }
  53. class MacBook @Inject constructor( @Named("scissor") val keyboard: Keyboard ) @Module

    class KeyboardModule { @Provides fun provideButterflyKeyboard(): Keyboard = ButterflyKeyboard() @Provides @Named("scissor") fun provideScissorKeyboard(): Keyboard = ScissorKeyboard() }
  54. public final class KeyboardModule_ProvideScissorKeyboardFactory implements Factory<Keyboard> { private final KeyboardModule

    module; public KeyboardModule_ProvideScissorKeyboardFactory(KeyboardModule module) { this.module = module; } @Override public Keyboard get() { return provideScissorKeyboard(module); } public static KeyboardModule_ProvideScissorKeyboardFactory create(KeyboardModule module) { return new KeyboardModule_ProvideScissorKeyboardFactory(module); } public static Keyboard provideScissorKeyboard(KeyboardModule instance) { return Preconditions.checkNotNull(instance.provideScissorKeyboard(), "Cannot return null from a non-@Nullable @Provides method"); } }
  55. public final class KeyboardModule_ProvideScissorKeyboardFactory implements Factory<Keyboard> { private final KeyboardModule

    module; public KeyboardModule_ProvideScissorKeyboardFactory(KeyboardModule module) { this.module = module; } @Override public Keyboard get() { return provideScissorKeyboard(module); } public static KeyboardModule_ProvideScissorKeyboardFactory create(KeyboardModule module) { return new KeyboardModule_ProvideScissorKeyboardFactory(module); } public static Keyboard provideScissorKeyboard(KeyboardModule instance) { return Preconditions.checkNotNull(instance.provideScissorKeyboard(), "Cannot return null from a non-@Nullable @Provides method"); } }
  56. public final class DaggerMainComponent implements MainComponent { private MacBook getMacBook()

    { return new MacBook( KeyboardModule_ProvideScissorKeyboardFactory.provideScissorKeyboard(keyboardModule) ); } public static final class Builder { private KeyboardModule keyboardModule; private Builder() {} public Builder keyboardModule(KeyboardModule keyboardModule) { this.keyboardModule = Preconditions.checkNotNull(keyboardModule); return this; } public MainComponent build() { if (keyboardModule == null) { this.keyboardModule = new KeyboardModule(); } return new DaggerMainComponent(keyboardModule); } } }
  57. public final class DaggerMainComponent implements MainComponent { private MacBook getMacBook()

    { return new MacBook( KeyboardModule_ProvideScissorKeyboardFactory.provideScissorKeyboard(keyboardModule) ); } public static final class Builder { private KeyboardModule keyboardModule; private Builder() {} public Builder keyboardModule(KeyboardModule keyboardModule) { this.keyboardModule = Preconditions.checkNotNull(keyboardModule); return this; } public MainComponent build() { if (keyboardModule == null) { this.keyboardModule = new KeyboardModule(); } return new DaggerMainComponent(keyboardModule); } } }