LoginSignup
9
4

More than 5 years have passed since last update.

本稿は、「なんかDaggerの記事たくさんあるけど、長くてよくわかんねぇー。てかビルドすらできねぇ...」という方の為の記事です。初めてDaggerを使う人が3分でDaggerの初歩的な使い方を知ることを目的とします。

Daggerって何?

そもそもDIとは?

依存性の注入なんて言われても意味わからないですよね。
例えばヘッドッセット。ヘッドセットってヘッドホンとマイクで出来てますよね。
「マイクだけ高価なのに変えたい」と思ってもマイクだけ取り外せない...
というか外したら壊れますよね。なぜならマイクに依存した実装がされているからです。
この依存性を排除して、マイクだけとっかえ可能にしようぜ!というのがDIです。
そういう設計にすればヘッドホンに高価なマイクを装着(依存性の注入)ができますよね。

Daggerとは?

アノテーションを用いてソースコードを自動生成します。
それによりDIを簡単、簡潔に実現してくれるのがDaggerです。

Daggerで使うパーツを理解する

Module

モジュールの役割は、提供したいオブジェクトのインスタンスを生成することです。

Component

コンポネントの役割は、Moduleが提供するインスタンスを受け取りたい側とModuleを繫ぐことです。
モージュルで生成されたインスタンスはコンポネントを経由して渡されます。

3秒で理解したい人用

ここはとあるレストラン←@Module

あなた「麻婆豆腐、激辛で」←@Inject
ウエイター「かしこまりました、
      オーダー入りまーす..略」←@Component
厨房「ガッテン承知」←@Provides

たぶんこんな感じ

実践

1.Moduleを作成する

  • Moduleには@Moduleを付与します。コンストラクタに引数を設定することも可能です。
  • @Providesを付与したメソッドで提供したいオブジェクトのインスタンスを返しましょう。
//引数も指定できます
@Module
class SampleModule(var msg:String) {

    //@Provideを付与したメソッドで注入したいオブジェクトのインスタンスを返す
    @Provides
    fun provideHoge():Hoge {
        return Hoge(msg)
    }
}

2.Componentを作成する

  • Componentには@Componentを付与します。インスタンスを提供してくれるModuleクラスを指定しましょう。
  • injectというメソッドを定義することで、指定したModuleクラスから得られるオブジェクトを@Injectを指定したメンバに注入するコードが自動生成されます。
  • injectメソッドの引数には依存性を注入するクラスを指定します。
  • 勘違いをしやすいですが、依存性を注入するのではなく依存性の注入を依頼するというニュアンスです。
//アノテーションの引数でModuleを指定しましょう。
@Component(modules = [SampleModule::class])
interface SampleComponent {

    //Moduleで生成するインスタンスを受け取るクラスを引数にとる
    fun inject(activity: MainActivity)
}

3.いったんBuild

  • BuildするとDagger+〇〇Component(2で作ったComponent名)というクラスが自動で生成されます。

4.@Injectする

  • Moduleで生成するインスタンスを受け取りたいメンバには@Injectを付与します。
  • Componentを実装して、適宜設定を加えて依存性の注入依頼をしましょう。
class MainActivity : AppCompatActivity() {

    //Moduleで生成するインスタンスを受け取りたいメンバに@Injectを付与
    @Inject lateinit var hoge:Hoge


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //自動生成されたクラス
        DaggerSampleComponent.builder()
                //自動生成されたModuleを引数にとるメソッド
                .sampleModule(SampleModule("テスト"))
                .build()
                //Componentにつくったinjectメソッド
                //上記の内容で依存性の注入を依頼
                .inject(this)

        Log.e("TEST", hoge.msg())

    }
}

最後に

Daggerにはたくさんのアノテーションが用意されています。
使い方だけではなく裏側の処理、Dagger自体のロジックをかじってみることもとても大切です。
少しずつ学んで行きましょう!
次のステップには@SubComponentやAndroid拡張がオススメです。

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4