【问题标题】:Inject in scala object注入 scala 对象
【发布时间】:2016-09-13 11:02:06
【问题描述】:

我正在使用 Play framework 2.5 并尝试将 WSClient 注入到我的控制器中使用的 scala 对象中。

import play.api.libs.concurrent.Execution.Implicits.defaultContext

    object MyObject {

        @Inject
        var ws: WSClient = null

        def doSomething() = { // use wsclient }

    }

我在几个控制器中使用 MyObject,当调用 doSomething() 时,wsclient 为空。

【问题讨论】:

    标签: scala playframework guice


    【解决方案1】:

    您应该将MyObject 定义为类并将 wsclient 注入它:

    class MyObject @Inject()(ws: WSClient) {
        def doSomething() = { /* use wsclient */ }
    }
    

    【讨论】:

    • 对象不可能?我必须定义一个类?
    • 据我所知,只有在 Play 模块初始化stackoverflow.com/questions/13791815/…
    • 是否可以使用类似的方法以控制反转的心态来@Inject Java 类?
    • 这如何解决 OP? OP 现在必须创建 MyObject 的实例,因为它现在是一个类
    • 不可能。但对于任何发现这一点的人来说,我发现一种可行的模式是使用一个伴随对象和一个 apply 方法,该方法接受依赖项,并返回该类的一个实例。在 Companion 对象中,确保只创建了该类的一个实例。这样,当您调用伴生对象时,它将在第一次调用时创建它,然后重用该实例。这是我能想到的唯一纯 DI 解决方法。
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多