dependency-injection - 在 Kotlin 的 Injekt 库中,如何注入(inject)函数而不仅仅是值?

标签 dependency-injection kotlin kohesive-injekt

在 Kotlin 中使用 Injekt 库进行依赖注入(inject)时:

有时我想注入(inject)一个函数,而不是注入(inject)一个值。所以像通过以下方式接收函数:

 val function: (Int) -> Int = Injekt.get()

这似乎工作正常,但如果我注册多个具有相同签名但含义不同的函数,则不行。似乎没有办法区分这些功能。

注意: 这个问题是作者有意编写和回答的 ( Self-Answered Questions ),因此常见 Injekt + Kotlin 主题的惯用答案都出现在 SO 中。也欢迎其他答案,还有其他风格的如何做到这一点!声明一下,我是 Injekt 库的作者。

最佳答案

你是对的,这些函数归结为签名的内部表示,例如在本例中为:

kotlin.jvm.functions.Function1<? super java.lang.Integer, ? extends java.lang.Integer>

任何具有相同参数和返回类型的函数都将具有相同的内部类型,并且对于 Injekt 来说似乎是相同的。以下注册均有效且不冲突:

// register some functions

Injekt.addSingletonFactory {
    val function: (value: Int) -> Int = { value -> value + 1 }
    function
}

Injekt.addSingletonFactory {
    val function: (Long) -> Long = { value -> value - 1 }
    function
}

Injekt.addSingletonFactory {
    val function: (Long) -> String = { value -> "The long is $value" }
    function
}

// inject and use the functions

val intFunction: (Int) -> Int = Injekt.get()
val intResult = intFunction(2)

val longFunction: (Long) -> Long = Injekt.get()
val longResult = longFunction(2)

val longStringFunction: (Long) -> String = Injekt.get()
val stringResult = longStringFunction(10)

如果您想使用相同的函数签名作为不同的含义,您可以为函数的每个含义创建一个类包装器:

class Int1Action(val function: (Int) -> Int) {
    operator fun invoke(i: Int): Int = function(i)
}

通过添加invoke运算符,你可以自然地使用这个包装器,而无需引用function成员,例如:

Injekt.addSingletonFactory {
    val function: (Int) -> Int = { value -> value + 20 }
    Int1Action(function)
}

val action: Int1Action = Injekt.get()
val result = action(2) // call it directly using the invoke operator

关于dependency-injection - 在 Kotlin 的 Injekt 库中,如何注入(inject)函数而不仅仅是值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550923/

相关文章:

java - 当我有很多 SpringBootTest 类时,如何有效地使用嵌套配置类来注入(inject)依赖项

c# - 我知道如何使用依赖注入(inject),但我认为它没有实际优势

c# - Microsoft.Extensions.DependencyInjection : DI'd code runs fine on dotnet CLI/Rider default . NET 配置文件,但导致 VS2022 崩溃

ios - View Controller 、依赖注入(inject)和 init/viewDidLoad

java - 使用 Kotlin 的数字运算是否与使用 Java 原语的运算一样快?

kotlin - 2x NavHostFragments 在 LayoutInspector 中可见,但在我的布局中只有 1 个

java - Vert.x 启动应用程序的最佳方式(Vert.x 命令行与 Main 方法)

android - 在 Kotlin 的 Injekt 库中,如何创建本地作用域,例如为每个 Android Activity 创建本地作用域?