如何在scala中用构造函数参数将单例类注入到另一个类中,并仅通过构造函数创建它的对象?

6uxekuva  于 2023-10-18  发布在  Scala
关注(0)|答案(2)|浏览(128)

我有一个单例类:

@Singleton
class Inject_Class_A @Inject()(
                            wsClient: WSClient,
                          )(implicit executionContext: ExecutionContext) {
// ... does something

}

我有另一个主类,我想注入前一个类,它也有其他构造参数。IDE说它在语法上是正确的:

class Main_Class @Inject()(
                           inject_class_A: Inject_Class_A,
                           implicit val executionContext: ExecutionContext
                           )(key: String, value: String) {

// ... does something different using inject_class_A
}

现在我想创建对象为:

val main_class = new Main_Class(key: "KEY", value:"VALUE")

当然,它给出了错误:

Unspecified value parameters: inject_class_A: Inject_Class_A, executionContext: ExecutionContext

我也试过这种方法:

class Main_Class(key: String, value: String) {

  @Inject val inject_class_A: Inject_Class_A = new Inject_Class_A()

// ... does something different using inject_class_A
}

但这不起作用,因为我没有wsClient: WSClientexecutionContext: ExecutionContext,这些我只能从注射只。

t98cgbkg

t98cgbkg1#

使用标准的Guice,你可以 * 或者 * 注入一个类 * 或者 * 自己示例化它。不能两个都同时。你可以注入到一个现有的示例中,但这很难看。如果您需要一个带有运行时确定参数的注入示例,您应该查看Assited injection

slwdgvem

slwdgvem2#

  • 不太清楚你想用这个模式实现什么,因此我的答案可能不适合你的用例。

一种选择是使用“wrapper”类:

// No automatic injection for this class
// Move implicit parameter at the end for ease of instantiation 
class Main_Class (inject_class_A: Inject_Class_A)
                 (key: String, value: String)
                 (implicit val executionContext: ExecutionContext) {
}

@Singleton
class Wrapper @Inject()(inject_class_A: Inject_Class_A)
                       (implicit val executionContext: ExecutionContext) {

  // Manual instantiation of Main_Class
  // Implicit automatically passed
  val main1 = new Main_Class(inject_class_A)("key", "value")

}

相关问题