我的根包对象中有一个隐式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文档说不建议在已经初始化的模块上绑定,因此我添加了additionalModule用于测试/模块重用目的,并将其与预定义模块聚合在一起。 我做对了吗?
答案 0 :(得分: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所提到的,你需要注意组合中模块的顺序。