spring - 如何将 IoC 注入(inject) Kotlin 顶级函数?我什至使用 IoC 容器吗?

标签 spring dependency-injection functional-programming inversion-of-control kotlin

我很难跟随 FP。当人们说“更惯用的风格”时,我必须明白:99% 的 Java 库不适用于 Kotlin 和 Scala 的 FP 惯用风格,对吧?好吧,我需要 Spring Boot 来快速启动 Vaadin。所以我需要注入(inject)一些 bean 。

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
}

那么我将如何注入(inject) SpringNavigator在这种情况下进入这个功能?

由于到目前为止我有几个顶级函数,我没有 @Component 也没有 @Bean ,在 Kotlin 中使用 Spring IoC 的惯用方式是什么?我是否仅限于使用类(class)或者我们有技巧可以做到这一点?

最佳答案

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

通常,在 OO 中,您可以通过注入(inject) 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
    }
}

关于spring - 如何将 IoC 注入(inject) Kotlin 顶级函数?我什至使用 IoC 容器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43582389/

相关文章:

c# - 依赖注入(inject) (DI) 的最佳方法

Java 对采用另一个类的子类的方法的引用

Spring MVC-当我尝试使用 proxyMode=ScopedProxyMode.TARGET_CLASS 时出现错误

java - SimpleJdbcCall 忽略 JdbcTemplate 获取大小

php - 如何利用 StorageFacade 的 Filesystem 类的 glob 方法?

c# - .Net Core - 将 API 中间件中的依赖项 IUserInfo 注入(inject)到存储库层

Scala:如何理解Try的flatMap方法?

clojure - 将数据库访问/功能放在 clojure 应用程序中的何处?

Spring Redirect 命令重定向到 Load Balancer 下的 Localhost

java - 使用构造函数注入(inject)模式对 spring boot 进行集成测试