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使った方が早そうだね。