【问题标题】:How to pass multiple parameter for Kodein Injected instances?如何为 Kodein Injected 实例传递多个参数?
【发布时间】:2019-09-24 14:45:47
【问题描述】:

在 Kodein 中,我有以下绑定

    bind<AppDependent>() with multiton {
        title: String -> AppDependent(title, instance(), instance())
    }

我可以使用

创建它
private val appDependent: AppDependent by instance(arg = "My Text")

但是,如果我的绑定有多个参数,例如

    bind<AppDependent>() with multiton {
        title: String, something: String -> AppDependent(title + something, instance(), instance())
    }

我怎样才能实例化它?我看到instance() 函数中只有一个arg

【问题讨论】:

    标签: kotlin kodein


    【解决方案1】:

    在下一个版本中,多参数工厂将被弃用,因为这会让很多人感到困惑。

    我们建议改用data classes,例如:

    data class DiceParamerters(val startNumber: Int, val sides: Int)
    
    val kodein = Kodein {
        bind<Dice>() with factory { params: DiceParameters -> RandomDice(params) }
    }
    

    【讨论】:

    • 在传递数据类时,假设参数只是可序列化的数据,我假设?如果对于一些不可序列化的东西,那么我们必须回到M 我猜。
    • 不,不需要可序列化。 M 将在 6.5 中弃用并在 7.0 中删除,您应该改用 data classes
    • 对我来说似乎很清楚,不确定谁感到困惑以及为什么。但是,data 类比可变参数有一个好处,我们可以为参数设置默认值。文档仍然说multiton 最多可以占用 5 个参数,这不能与 v7 一起编译。 OSS 和文档,别让我开始。
    • 这绝对是一个文档问题。当您有多个参数时,推荐使用data class。使用数据类的好处是我们可以放置无限数量的参数。否则,我们将不得不为绑定区域的 N 个参数编写 N 个实现。
    【解决方案2】:

    显然,M 作为参数的包装器

    private val appDependent: AppDependent by instance(arg = M("abc", "def"))
    

    https://weekly-geekly.github.io/articles/431696/index.html 找到答案。在 Kodein 文档中找不到它们:(

    参数最多可以达到 5 个,如 https://kodein.org/Kodein-DI/?6.3/core

    Just like a factory, a multiton can take multiple (up to 5) arguments.

    【讨论】:

    • M 将在 6.5 中弃用并在 7.0 中删除,您应该改用 data classes
    • 另外,multiton 不会回答您的问题。多实例是单实例,具体取决于参数。
    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2011-03-29
    相关资源
    最近更新 更多