gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:39:24 55 4
gpt4 key购买 nike

我很难跟随 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/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com