如何使用Koin创建具有运行时依赖项的实例?

时间:2018-11-06 14:14:47

标签: kotlin koin

我在构建基于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上下文中存储“帮助程序”,然后在制作各种实例的同时从上下文中检索它来解决此问题,但这感觉很笨拙且重复。我希望有一种更清洁的方法来解决这个问题。

1 个答案:

答案 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