Androidで手動でDIして遊んだ
なんかちょっと作ってるAndroidアプリがDIコンテナ使うほどの規模じゃないんですけどDIはしたいって感じだったのでこんな感じで遊んだよまる
遊んだ言うてそんな面白いことはしてません。
object Dependencies { inline fun <reified T> AppCompatActivity.inject(vararg args: Any?): T { val methodCallable = (this@Dependencies)::class.members.single { it.returnType.isSupertypeOf(T::class.createType()) } return methodCallable.apply { isAccessible = true }.call(this@Dependencies, *args) as T } inline fun <reified T> ViewModelStoreOwner.viewModel(vararg args: Any?): Lazy<T> where T: ViewModel { return lazy { ViewModelProvider(this, object : ViewModelProvider.NewInstanceFactory() { override fun <R : ViewModel?> create(modelClass: Class<R>): R { return T::class.primaryConstructor!!.call(*args) as R } }).get(T::class.java) } } private fun provideRepository(): MyRepository = MyRepositoryImpl(provideApi()) private fun provideMyApi() = singletonApi private val singletonApi by lazy { // Retrofit.Builder()モチモチ } }
class MyActivity { val viewModel: MyViewModel by viewModel(inject<MyRepository>()) } 的な
型モチモチはパズルみたいで楽しいね。viewModelはktx使った方が早そうだね。