1

我很难遵循FP。当人们说“更习惯风格”时,我必须明白:99%的Java库不适用于Kotlin和Scala的FP惯用风格。那么,我需要Spring Boot来与Vaadin快速启动。所以我需要注入一些豆。如何将IoC注入到Kotlin顶层函数中?我甚至使用IoC容器吗?

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,什么是使用Spring IoC for Kotlin的惯用方式?我仅限于使用课程,或者我们有技巧来做到这一点?

+2

顶级功能相当于Java静态方法。我不确定它是否合理,或者是将注入依赖关系的好实践。 作为一个良好的做法,恕我直言,我会建议你把这些函数放在你使​​用依赖注入进行配置的类中。 – Mario

回答

0

问题是你有一个签名为(Navigator) -> MenuBar的函数,但你可能想要的是一个带签名() -> MenuBar的函数。

通常,在OO中,您可以通过将Navigator注入到构造函数中,保存该引用,然后在函数被调用时使用它来实现此目的。

在函数式编程中,类似的概念是调用“部分函数应用程序”。这是当您将参数预先应用于函数并创建一个接受其余参数的新函数时。在我们的案例中,我们希望预先申请Navigator,这将给我们留下() -> MenuBar的签名。

This看起来像是一个关于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 
    } 
}