【发布时间】:2021-08-22 08:30:16
【问题描述】:
我有这个绑定来在我的应用程序中配置 Logger[IO](此行的模块在 guice.conf 文件中):
class CatsEffectModule extends AbstractModule with ScalaModule {
override def configure(): Unit = {
bind[Logger[IO]].toInstance(Slf4jLogger.getLogger[IO])
}
}
然后在应用程序中我可以这样做:
@Singleton
class MyClass @Inject()(implicit logger: Logger[IO]) { ... }
这在应用程序中运行良好。
但在GuiceInjectorBuilder(用于测试)中使用时不起作用:
import play.api.inject.guice.GuiceInjectorBuilder
private val application: Injector = new GuiceInjectorBuilder()
.bindings(bind[ExecutionContext].to(ExecutionContext.global))
.bindings(bind[ApplicationLifecycle].to[DefaultApplicationLifecycle])
.bindings(new CatsEffectModule())
.build()
application.instanceOf[MyClass]
它给了我一个错误:
No implementation for io.chrisdavenport.log4cats.Logger was bound.
[info] Did you mean?
[info] io.chrisdavenport.log4cats.Logger<cats.effect.IO> bound at guice.CatsEffectModule.configure(CatsEffectModule.scala:21) (via modules: com.google.inject.util.Modules$OverrideModule -> guice.CatsEffectModule)
测试中的每个 TF 实体注入都会像这样失败。 Akka Play 运行 Guice 的方式与 GuiceInjectorBuilder 的工作方式有什么区别吗?
【问题讨论】:
-
我想你可以试试这个 application.injector.instanceOf[CatsEffectModule]
-
@ShwetaValunj 它已经是一个注射器。
build()只是在斗篷下打电话给injector()。另外我想我不需要 CatsEffectModule 的实例。它只包含一些其他绑定。即使我在测试中复制它们也行不通(我试过)。 -
啊。我刚注意到建设者。您是否尝试过使用 org.scalatestplus.play.guice 中的 GuiceOneAppPerSuite ?
-
据我所知,它使用
GuiceApplicationBuilder从guice.conf启动所有模块。我使用GuiceInjectorBuilder因为我只想要一个模块。也许它会起作用(因为它会遵循与启动应用程序相同的逻辑),但我需要让它与GuiceInjectorBuilder一起工作。 -
我在问题中添加了示例 repo url。重写后,我注意到我们使用了一些自定义的
AbstractModule包装器 -ScalaModule。但在构建 guice builder 时,它仍然用于测试。
标签: scala akka guice tagless-final