Kodeinのfactory関数を実装する2018年03月11日(編集2018年03月14日)TweetAndroidアプリ開発では、springフレームワークを使った開発のように、DIコンテナを利用できます。2がよく利用されていますが、kotlinではKodeinを使うのが一般的です。この記事は、Kodeinを使ってDIを実装する方法を記載した記事です。中級者向けサンプルコードAndroid-kotlin-Library-DemoDIDIの定義を一言で表現すると、「外からオブジェクトを設定する」です。DIを使うと疎結合なコードを書けるようになり、テストコードの実装やコードの修正が容易になります。アプリ設計サンプルアプリを作成してKodeinを使用します。画面のボタンを押して、Kodeinのfactory関数を実行します。インストールKodeinを使うには、{project_folder}/app/build.gradleに下記のコードを記述します。'com.github.salomonbrys.kodein:kodein-android:4.1.0'}当然ですが、プロジェクトでkotlinを導入している必要があります。インストールが完了すれば準備は完了です。factory実装Activityでfactory関数を使った実装をします。}}オブジェクトで関数を実装します。Kodeinの宣言Kodeinクラスとブロックを実装します。{}Kodeinブロックの中に関数を実装します。これがKodeinのDIの形です。bindingfactory関数はKodeinブロック内で実装します。}上記はString型をfactory関数にbindしています。bind関数は、指定された型(上記はString)のbindを開始します。理解を深めるために、Kodeinのbind関数のコードを読んでいきましょう。overrides)bind関数は拡張関数で実装されています。paramterを使っています。parametersは、普段の実装では利用しない人のほうが多いのではないでしょうか。実際、知らなくてもkotlinを使った実装は可能です。parametersは公式ドキュメントを読むだけでは理解は難しいです。理解している人は少ないです。parametersは、拡張性の高いコードを書いたり、ライブラリのコードを読むのに役立つ技術です。ライブラリのコードを読む場合に重宝します。コードを読めればライブラリのバグや仕様の理解をコードから判断できるので、習得しておくことをオススメします。習得の方法ですが、公式ドキュメントは情報の質は高いのですが、理解が難しいので「Kotlinイン・アクション」を利用することをオススメします。公式ドキュメントよりも、ページを多く割いて丁寧に説明しています。今回のサンプルは「bind<String>()」なので、引数tagとoverridesはnullです。Bind関数は、TypeBinderクラスを生成します。TypeBinderクラスはwith関数を宣言しています。binding}with関数はinfixキーワードが宣言されているので、中置表記法を使用して関数を呼び出せます。withwith関数の引数はBinding型です。factory関数はここで引き渡します。factoryfactory関数は、Bindingインターフェースを継承し、FactoryBindingクラスを生成します。arg)}factory関数の引数に渡す関数は、引数をとり、Bindのオブジェクトを返します。引数を取るのは、factory関数の引数がBindingKodeinインターフェースだからです。creator)記事のサンプルでは「Int型を引数に取りString型を返す関数」をブロックに渡します。}引数に渡された関数は、バインドされた型のインスタンスが必要になるたびに毎回呼び出されます。返却の型>.invoke(引数の型)で呼び出せます。String>().invoke(1)invoke関数でSample.calling(1)を呼び出します。invoke関数はKodeinインターフェースで実装されています。}}ここでは省力しますが、余裕が出てきたらinvoke関数が実行されるプロセスを追ってみると良いと思います。ビルド上記コードの動作を確認しましょう。factoryボタンを押してhelloFactoryを実行します。factory関数の実行結果うまく動作するのが確認できました。結論androidアプリは、今後ますます肥大化が予想されます。疎結合な実装ができるDIを使う機会は増えると思います。その際にKodeinは役に立つので是非マスターしてください。kotlinの実装に慣れてきた人は、Kodeinのソースコードを研究してみてください。kotlinの実力を飛躍的にアップできると思います。