blogレシピ動画サービス「kurashiru」を運営するdelyのテックブログ2019-12-01マルチモジュール時代のDagger2によるDITweetこんにちは。dely株式会社のAndroidアプリチームのうめもりです。Calendarをやることになりました。開発部の面々が色々な記事を今年も書いてくれますので、是非ほかの記事も見て行ってください。Calendarの1日目の記事です。Androidのマルチモジュール構成のアプリケーション上でDagger2を用いて依存性解決を行うやり方を、簡単なマルチモジュール構成のアプリケーションを例に紹介します。今回想定するアプリケーションのモジュール構成は次のようになっています。Moduleから呼ばれるクラスを定義する一般的なマルチモジュール構成に近いと思われるシンプルな構成にしてみました。Moduleを分割したりする必要が出てくると思いますが、その場合でも今回の方法と同じように対応することができるはずです。Moduleへの依存関係が発生すると思われます。Dagger2のスコープDagger2のスコープは@Singleton@ViewScopeの2つの定義にしました。@ViewScopeについては新規に定義したScopeです。Activity/FragmentごとにScopeを切るようにしてみました。Scopeの定義は次のようになっています。Module内では、通常のDagger2と同じようにクラス定義を行うだけです。Module内でほぼすべてを行うので、そちらに集約してしまうのがよいかもしれません。Module側で定義したクラスに依存する形でActivityやFragmentを定義します。規模の大きくないアプリケーションでは実際にはこのModuleでDagger2のComponent定義を行ってしまってもいいとは思いますが、今回はComponent定義をUI定義から分離することを考えます。必要なのは、ActivityやFragmentに対して依存性を注入するためのinterfaceです。それを素直に定義しましょう。Module内で行うので、アノテーションなどをつける必要はありません。どこからかinject用のinterfaceを取得して注入用のメソッドを呼ぶ必要があります。今回は、カスタムApplicationクラスにinterfaceを実装することにして、Applicationクラスからinterfaceを取得するinterfaceを作成しましょう。実際のコードはこのようになります。ViewInjectors}そして、Activity/Fragment側では、定義したinterfaceにキャストしてinjectするコードを記述します。Module内でDagger2のComponent定義を行います。今回は、@Singletonと@ViewScopeの二つのScope定義があるので、Component定義も2つになります。Moduleで定義したinterfaceを継承します。Moduleで定義したinterfaceを実装しましょう。一度ビルドを行えば、Daggerによって生成されたComponentを参照できるようになっているはずです。)}終わりに以上、マルチモジュール構成のアプリケーションでDagger2による依存性解決を行うやり方を紹介しました。ポイントとしては、依存性解決にかかわるコードは最終的にモジュールを集約するモジュールにまとめて記述するようにするという点です。そこさえ守っていればそう難しくはありません。APIを使ってみた」という記事です。