0

我的根包对象中有一个隐式 scaldi 模块,因此任何组件都可以隐式使用注入器。

该模块如下所示:

val additionalModule = new AtomicReference[Module](new Module {})

lazy val applicationModule = additionalModule.get ++ new Module {
  bind[Trait1] to new Impl1
  bind[Trait2] to new Impl2
} 

Scaldi 文档说不建议绑定已经初始化的模块,因此我添加了附加模块以用于测试/模块重用,并将其与预定义的模块聚合。我做对了吗?

4

1 回答 1

0

我不建议让注射器在全球范围内可访问。如果你想在特定的类中使用它,我建议你Injector为这个类引入一个隐式参数。像这样的东西:

class UserService(implicit inj: Injector) extends Injectable {
  // ...
}

更多信息

或者,您可以将构造函数注入与injected宏结合使用:

class TokenRepo(db: Database, metrics: Metrics) extends Tokens {
  // ...
}

现在你可以像这样绑定它:

class MyModule extends Module {
  bind [Tokens] to injected [TokenRepo]
}

更多信息

当您进行测试时,如果您在测试中以不同的方式组合模块实例,则不要重用模块实例,这一点很重要。这意味着在您的情况下,您不仅需要实例化测试模块,还需要实例化应用程序模块。例如:

implicit injector = new TestModuleWithMocks ++ new Appmodule

正如@Mironor 提到的,您需要注意组合中模块的顺序。

于 2016-02-23T15:14:53.983 回答