0

所以,我试图用如下所示的东西来实现编译时 DI:

package modules

class MyModule extends AbstractModule {
  def configure() {
    bind(classOf[MyT]).to(classOf[MyTImpl])
  }
}

class MyApplicationLoader extends GuiceApplicationLoader {
  override protected def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {
  initialBuilder
    .in(context.environment)
    .loadConfig(context.initialConfiguration)
    .overrides(overrides(context): _*)
    .load(new MyModule)
  }
}

application.conf 包含一行:

play.application.loader = "modules.MyApplicationLoader"

但是,当我尝试启动应用程序时,出现错误:

ConfigurationException: Guice configuration errors:

1) No implementation for play.api.Application was bound.
  while locating play.api.Application

1 error

No source available, here is the exception stack trace:
->com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for play.api.Application was bound.
  while locating play.api.Application

1 error
     com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1042)
     com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1001)
     com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051)
....

不明白为什么这不起作用,因为我见过的所有例子都没有做更多的事情。我在看什么?

4

2 回答 2

3

使用bindings代替load

class MyApplicationLoader extends GuiceApplicationLoader {
  override protected def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {
  initialBuilder
    .in(context.environment)
    .loadConfig(context.initialConfiguration)
    .overrides(overrides(context): _*)
    .bindings(new MyModule)
  }
}
于 2015-07-01T09:15:58.587 回答
1

我不确定您要在这里实现什么,但这不是编译时依赖注入的工作方式。Guice 在运行时发挥它的魔力。但是,如果您希望在应用程序启动时立即准备好依赖项,请使用预加载。Guice 已经提供了所有需要的工具:

我的模块

class MyModule extends AbstractModule {
  def configure() {
    bind(classOf[MyT]).to(classOf[MyTImpl]).asEagerSingleton()
  }
}

应用程序.conf

play.modules.enabled += "modules.MyModule"

因为MyTImpl将作为单例加载,所以它必须没有实例绑定数据。想想objectscala 术语。MyTImpl总是会注入完全相同的实例。

于 2015-07-01T08:57:49.977 回答