Dependency injection 如何注入数据类
我有一个数据类注入的问题 数据类:Dependency injection 如何注入数据类,dependency-injection,kotlin,koin,Dependency Injection,Kotlin,Koin,我有一个数据类注入的问题 数据类: data class CoroutinesDispatcherProvider( val main: CoroutineDispatcher, val computation: CoroutineDispatcher, val io: CoroutineDispatcher ) class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider)
data class CoroutinesDispatcherProvider(
val main: CoroutineDispatcher,
val computation: CoroutineDispatcher,
val io: CoroutineDispatcher
)
class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider):ViewModel() {
}
而viewModel需要此数据类:
data class CoroutinesDispatcherProvider(
val main: CoroutineDispatcher,
val computation: CoroutineDispatcher,
val io: CoroutineDispatcher
)
class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider):ViewModel() {
}
最后一个模块是:
val appModule = module {
single { (main: CoroutineDispatcher, computation: CoroutineDispatcher, io: CoroutineDispatcher) ->
CoroutinesDispatcherProvider(
main,
computation,
io
)
}
viewModel { MyViewModel(get()) }
}
但是得到错误:
Caused by: org.koin.error.BeanInstanceCreationException: Can't create definition for 'Factory [name='MyViewModel',class='com.example.myapplication.MyViewModel', binds~(androidx.lifecycle.ViewModel)]' due to error :
Can't create definition for 'Single [name='CoroutinesDispatcherProvider',class='com.example.myapplication.CoroutinesDispatcherProvider']' due to error :
Can't get parameter value #0 from org.koin.core.parameter.ParameterList@f87fb6
appModule出了什么问题 由于在单个声明中使用lambda,因此应该使用
parametersOf()
解析依赖关系。但是您首先需要初始化provider变量,因为您的viewModel
依赖于它:
data class CoroutinesDispatcherProvider(val main: CoroutineDispatcher, val computation: CoroutineDispatcher, val io: CoroutineDispatcher)
class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider) : ViewModel() {
fun helloworld() {
println("dispatcher: $dispatcherProvider")
}
}
val appModule = module {
single { (main: CoroutineDispatcher, computation: CoroutineDispatcher, io: CoroutineDispatcher) ->
CoroutinesDispatcherProvider(main, computation, io)
}
viewModel { MyViewModel(get()) }
}
class MyKoinTest : KoinTest {
val provider: CoroutinesDispatcherProvider by inject { parametersOf(Dispatchers.Main, Dispatchers.Default, Dispatchers.IO)}
val viewModel: MyViewModel by inject { parametersOf(provider)}
@Before
fun before() {
startKoin(listOf(appModule))
}
@Test
fun test1() {
viewModel.helloworld()
}
}
我使用了这些依赖项(koin_version='1.0.2'
):
请尝试下面我的解决方案