始めに
(✿✪‿✪。)ノコンチャ, OWNR by RENOSY Android開発のSugeunです。 今回はOWNR by RENOSYアプリで使っているデザインパターンDIとDaggerに関して紹介したいと思います。
DIとは
DI (Dependency Injection)とは、あるオブジェクトが、他のオブジェクトに依存性を提供するテクニックです。DIを使う目的としてはオブジェクトを生成することとオブジェクトを使えることを分離してつかえることになります。
Daggerとは
公式GitHubにDaggerはこのように書いております。
Daggerは静的で、Reflectionを使わずにコンパイル時間で依存性注入をするJavaとアンドロイドのフレームワークです。 以前まではSquareから制作されていて、今はGoogleが Performanceに合わせてアップデートや維持しています。
Dagger 公式GitHub: github.com
メリット
- クラス間の結合度が減らせるのでコードが柔軟になる。
- リファクタリングがしやすくなる。
- Unit Testが優しくなる✨
- コードの再活用性があがる。
デメリット
- DIを使うための先行作業が多いこと。
- コードを追うことが複雑になり、読みにくくなる。
- 学習コストが高い(?)
デメリットよりメリットが多いのでぜひ使うことをお勧めます。
注入する為の@Moduleと@Providesアノテーション
@Module : 依存性を提供するメソッドを持っているクラスです。
@Provides :依存性を提供するmethodを作って、オブジェクトを提供するのかを教えてあげます。
スタイルガイドとして@ModuleはClassの上端で、@ProvidesはMethod上端に付けるのが一般的です。 Moduleクラスは必要なオブジェクトを@Providesを使って管理します。
@Module class ExapleModule{ @Provides fun exampleProvidesOne() : Hoge { return Hoge() } @Provides fun exampleProvidesTwo(somthingRepository : SomthingRepository) : Fuga() { return Fuga(somthingRepository) } }
- DaggerではNullをInjectすることは禁止されていますので、ご注意ください! (Null注入のために別の@Nullableアノテーションが備えています。)
注入される為の@Injectアノテーション
@Inject : Daggerからインスタンスと注入して
と要望をします。
class Hoge @Inject constructor () {} class Fuga @Inject constructor (somthingRepository : SomthingRepository){ }
外部からの注入はこれだけです!Moduleからインスタンスを生成して注入してくれます。 タイミングとしてInjectが動くとき、ModuleからProvidesが走れ、作られたインスタンスが注入されます。
繋げる役割、@Componentアノテーション
@Component : Objectを提供する側と、消費する側の橋の役割を担ってます。定義したObjectをインスタンスしてくれます。
@Component(modules = { ExampleModule::class, SomeThingModule::class }) // @Moduleを付けたClass Fileを書きます。 interface ExampleComponent { @Component.Builder // Componentを生成するためのBuild用のアノテーションです。 interface Builder { @BindsInstacne fun application(application : Application) : Builder } }
@Moduleを使ったFileリストの中で@Moduleを使ってないFileが巻き込まるとコンパイルタイムにエラーが発生します。
終わり
上記の過程でDaggerを使う為の準備ができました。次の編ではDaggerの他のアノテーションやどうやってテストが楽になったのかについて紹介しようと思ってます。 今後もよろしくお願いします。(✿✪‿✪。)ノ 💫