我想定义2个注入的类,但是一个需要为构造函数使用第二类方法。我正在使用Koin框架
class MainActivity : AppCompatActivity() {
private val connectionService : ConnectionService by inject()
private val resourcesHelper : ResourcesHelper by inject()
private val addressPropertyName = "connection.address"
private val portPropertyName = "connection.port"
private val appModule = module {
single { ResourcesHelperImpl(androidContext(), R.raw.config) }
single {
ConnectionServiceTcp(
resourcesHelper.getConfigValueAsString(addressPropertyName),
resourcesHelper.getConfigValueAsInt(portPropertyName)
)
}
}
然后出现错误,因为我无法使用resourcesHelper实例化ConnectionServiceTcp。有没有办法使用注入的字段来注入另一个字段?
编辑 更改为get()会有所帮助,但现在我在模块配置方面遇到了麻烦。 我将开始koin移到MainApplication类:
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MainApplication)
androidLogger()
modules(appModule)
}
}
}
然后将模块添加到AppModule.kt
val appModule = module {
single { ResourcesHelperImpl(androidContext(), R.raw.drone) }
single {
ConnectionServiceTcp(
get<ResourcesHelper>().getConfigValueAsString(ResourcesHelper.droneAddressPropertyName),
get<ResourcesHelper>().getConfigValueAsInt(ResourcesHelper.dronePortPropertyName)
)
}
scope(named<MainActivity>()) {
scoped {
ConnectionServiceTcp(get(), get())
}
}
}
然后我尝试向活动注入一些对象, 原因:org.koin.core.error.NoBeanDefFoundException:找不到任何定义。检查您的模块定义。
答案 0 :(得分:0)
好的,我遇到了两个问题,首先我无法在构造函数中使用其他bean实例化bean,通过将我的调用更改为
可以解决此问题。 ConnectionServiceTcp(
get<ResourcesHelper>().getConfigValueAsString(ResourcesHelper.droneAddressPropertyName),
get<ResourcesHelper>().getConfigValueAsInt(ResourcesHelper.dronePortPropertyName)
)
其次,NoBeanDefFoundException出现问题,这是由于ResourcesHelperImpl中的androidContext()
导致的,我需要从活动中获取上下文,而不是koin上下文。