Spring 如何将IoC注入Kotlin顶级功能?我甚至使用IoC容器吗?

Spring 如何将IoC注入Kotlin顶级功能?我甚至使用IoC容器吗?,spring,dependency-injection,functional-programming,inversion-of-control,kotlin,Spring,Dependency Injection,Functional Programming,Inversion Of Control,Kotlin,我跟不上FP。当人们说“更惯用的风格”时,我必须理解:99%的Java库不适用于Kotlin和Scala的FP惯用风格,对吗?嗯,我需要弹簧靴,以便用Vaadin快速启动。所以我需要注射一些豆子 package com.x.ui import com.vaadin.icons.VaadinIcons import com.vaadin.navigator.Navigator import com.vaadin.ui.MenuBar fun createMenuBar(navigator: N

我跟不上FP。当人们说“更惯用的风格”时,我必须理解:99%的Java库不适用于Kotlin和Scala的FP惯用风格,对吗?嗯,我需要弹簧靴,以便用Vaadin快速启动。所以我需要注射一些豆子

package com.x.ui

import com.vaadin.icons.VaadinIcons
import com.vaadin.navigator.Navigator
import com.vaadin.ui.MenuBar

fun createMenuBar(navigator: Navigator): MenuBar {
    val menuBar = MenuBar()
    menuBar.setHeight(null)
    menuBar.setWidth(null)

    menuBar.addItem("Dashboard", VaadinIcons.COG,
            { navigator.navigateTo("Dashboard") } as MenuBar.Command)

    return menuBar
}
那么在这种情况下,我如何将
SpringNavigator
注入到这个函数中呢


由于到目前为止我有两个顶级函数,所以我既没有@Component,也没有@Bean,对于Kotlin来说,使用SpringIOC的惯用方法是什么?我是否仅限于使用类,或者我们有一些技巧来实现它?

问题是您有一个带有签名的函数
(Navigator)->菜单栏
,但您可能需要的是一个带有签名的函数
()->菜单栏

通常,在OO中,您可以通过将
Navigator
注入构造函数,保存引用,然后在调用函数时使用它来实现这一点

在函数式编程中,类似的概念称为“部分函数应用”。这是指将参数预应用于函数,并创建一个新函数以获取其余参数。在本例中,我们希望预先应用
导航器
,它将为我们留下
()->菜单栏
的签名

看起来是一篇关于Kotlin概念的好文章

我建议你试试这样的东西:

// note - returns `() -> MenuBar` now, rather than `MenuBar`
fun createMenuBar(navigator: Navigator): () -> MenuBar {
    // returning a function that takes no parameters
    return { ->
        val menuBar = MenuBar()
        menuBar.setHeight(null)
        menuBar.setWidth(null)

        menuBar.addItem("Dashboard", VaadinIcons.COG,
            { navigator.navigateTo("Dashboard") } as MenuBar.Command)

        return menuBar
    }
}

顶级函数相当于Java静态方法。我不确定这是否有意义,或者将依赖注入到它们中是否是一个好的实践。作为一个好的实践,我建议您将这些函数放在一个用依赖注入配置的类中。