[書評] Master of Daggerを読んだ

Master of Daggerを読んだ
https://booth.pm/ja/items/1577764

マスタカと言えばイケメンエンジニア
Daggerら
違ったwだからもっとイケメンになるために本書を読んでみた
以下、内容


・本書の内容
順序立ててDaggerの使い方を説明した本
後半はAndroidでの使い方の紹介もあるので
Androidエンジニアなら必読です

ためになったことを書いていく

・binding
「型」と「その型のインスタンスを取得する方法」の組のこと

・dependency
bidingの「その型のインスタンスを取得する方法」が必要とする他のインスタンスのこと
hoge:Hoge -> Fuga(hoge)
の場合、HogeはFugaのdependency

・オブジェクトグラフ
bindingの集合
keyが型で、Valueがその型のインスタンスを返すMapみたいなもの

・Module
bindingの定義をグループ化し、再利用できるようにしたもの

・Component
オブジェクトグラフを使って、「ある型」のインスタンスを取得する役割のもの

・inject
指定されたオブジェクトグラフから取得したインスタンスを代入すること

・クラスのコンストラクタに@Injectをつける
bindingオブジェクトグラフに登録される

これにより以下が動く

class BBB @Inject construcotr()

@Component
interface AAA {
    fun bbb: BBB
}

・Binds
interfaceと実装はこんな感じに実装する

@Binds
fun bindApi(impl: ApiImpl): Api

・複数のbinding
@Qualifierをつけると同じ型を複数登録できる

・by viewModels()
以下の方法でもviewModelを初期化できる

by viewModels(factoryProducer = {
    //Factory
})

・AndroidInejectionの処理
1. [MainActivity] onCreateでAndroidInjection.inject(this)を呼ぶ
2. [AndroidInejction.ineject()] MainActivityのgetApplicationでApplicationインスタンス(=MyApplication)を取得
3. [AndroidInjection.inject()]MyApplicationがHasAndroidInjectorを実装しているので、androidInjector()メソッドでAndroidInjector<Any>を取得する
4. [AndroidInjection.inject()]DispatchingAndroidInjectorインスタンスのinject()メソッドを呼ぶ
5. [DispatchingAndroidInjector.inject()]MainActivityをkeyにして、Provider<AndroidInjector.Factory<?>>インスタンスを取得
6. [DispatchingAndroidInjector.inject()]Provider<AndroidInjector.Factory<?>>.get()でAndroidInjector.Factory(=MainActivitySubcomponent.Factory)インスタンスを取得
7. [DispatchingAndroidInjector.inject()]MainActivitySubcomponent.Factoryのcreate()メソッドでAndoridInjector(=MainActivitySubcomponent)を取得
8. [DispatchingAndroidInjector.inject()]MainActivityのインスタンス引数としてMainActivitySubcomponentのinject()を呼ぶ

 

本書はとてもためになりました
Androidのスキルが高めにな人が読む本かなぁとは思います
とりあえず読んだだけなので本書を参考に実際にコード書いてみようと思います
Daggerのスキルを学びたい人には必読の1冊かなと思います

関連記事:

Pocket