我在构建基于Kotlin的HTTP服务器时正在尝试Koin。
我正在使用一个框架,在该框架中,您可以通过扩展一些框架提供的抽象类来编写所需的行为,并在组件生命周期的各个阶段(类似于Android)填充实现逻辑。在组件生命周期的某个时刻,特定于框架的资源(显示为字段)被初始化并可供使用。
我的问题是我需要此字段才能创建从我的Koin模块返回的实例。
我想做的是这样的:
interface MyInteractor
class MyComponent : FrameworkComponent(), KoinComponent {
// "helper" is a field local to this class and used as
// an injection parameter
private val myInteractor: MyInteractor by inject { parametersOf(helper) }
private val myModule = module {
single<MyInteractor> { (helper: FrameworkField) ->
// return an instance of MyInteractor using "helper"
}
}
// lifecycle method
override fun start() {
startKoin(listOf(myModule))
}
}
上面的方法不起作用,因为“ helper”直到组件生命周期的较晚阶段才被初始化。
我设法通过在Koin上下文中存储“帮助程序”,然后在制作各种实例的同时从上下文中检索它来解决此问题,但这感觉很笨拙且重复。我希望有一种更清洁的方法来解决这个问题。
答案 0 :(得分:0)
当然有
在您的模块中,如下定义模块,
single { (args: Array<Any>) -> SignInViewModel(args[0] as SignInCallback) }
然后在您的活动中,传递如下所示的参数值,
val signInModel by inject<SignInViewModel>(parameters = getDefinitionParams(this@SignInFragment))
和getDefinitionParams()这样
fun getDefinitionParams(vararg any: Any) : ParameterDefinition{
return object : ParameterDefinition {
override fun invoke() = parametersOf(any)
}
}
希望这对您有所帮助,祝您编码愉快:D