1

在构建基于 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))
    }
}

尽管“助手”直到组件生命周期的后期才被初始化,但上述内容不起作用。

我已经设法通过在 Koin 上下文中存储“帮助程序”然后在创建各种实例时从上下文中检索它来解决这个问题,但这感觉很笨拙和重复。我希望有一种更清洁的方法来解决这个问题。

4

1 回答 1

2

当然有

在您的模块中,定义您的模块,如下所示,

 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

于 2019-02-27T11:26:22.517 回答