見出し画像

[Android] DependencyProperty をリリースしました

# DependencyProperty とは

依存するオブジェクトを Delegated Properties で解決するライブラリです。

DependencyProperty はマニュアル DI と組み合わせて使う Service Locator パターンのライブラリです。シンプルな概念と実装で簡単に依存関係の定義・解決できます。Delegated Properties を利用して依存オブジェクトを解決できます。

ViewModel, UI Test, Dynamic Feature Module などのアプリ設計要件にも対応しています。ViewModel は特別な設定なしでコンストラクタインジェクションが可能です。UI Test は Dagger Hilt よりも少ないコードで設定できます。マルチモジュールや Dynamic Feature Module でも簡単に利用できます。

コード生成やリフレクションを利用していないため、Dagger よりもビルド時間が短く、Dagger や Koin よりも実行速度が速いです。

# DependencyProperty のテーマ

Make Dependency resolution Simple Again.
依存解決にシンプルさを取り戻す。

Dagger のような複雑な概念や設定は必要ありません。また、Koin のように見た目だけの部分的なシンプルさではありません。概念自体をシンプルにして、シンプルに依存解決できるようにしています。

# DependencyProperty のコンセプト

Domain はマニュアル DI で、Presentation は Service Locator で依存解決するというのが基本コンセプトです。DependencyProperty は Domain の生成ロジックを管理し、Service Locator を支援します。
ここでいう Domain や Presentation は Presentation Domain Separation の Domain と Presentation です。

Presentation は DI するのが大変なので Application から取得すれば良く、Domain はコンストラクタインジェクションで DI します。

# DependencyProperty のコンポーネント

DependencyProperty のコンセプトを理解するには以下の4つのコンポーネントを理解するのが良いです。

DependencyModulesHolder
 ・DependencyModules を保持するインターフェース
 ・Application で実装することで Application が Service Locator となる
DependencyModules
 ・DependencyModule のコレクションオブジェクト
 ・追加・更新・削除によってスコープや Dynamic Feature Module に対応
DependencyModule
 ・マーカーインターフェース
 ・依存オブジェクトの生成ロジックを実装する
DependencyProperty
 ・Delegated Properties で依存オブジェクトを解決する拡張関数
 ・Application を取得できる Activity や Fragment などから利用可能

以下のような流れで Presentation から Domain への依存を解決します。

画像1

# DependencyProperty について

https://wada811.github.io/DependencyProperty/
使い方が載っています。

https://github.com/wada811/conference-app-2020/pull/1
DroidKaigi 2020 conf app を DependencyProperty で置き換えたサンプルです。基本的な使い方を実際のコードで確認できます。

https://github.com/wada811/iosched/pull/1
IOSched を DependencyProperty で置き換えたサンプルです。
Product Flavors, UI Test などでの使い方を実際のコードで確認できます。

https://github.com/wada811/android-dependency-injection-performance/pull/1
DI ライブラリのパフォーマンスを比較しています。基本的に最速です。


この記事が気に入ったらサポートをしてみませんか?