Playframework GUI应用程序加载程序配置错误

Playframework GUI应用程序加载程序配置错误,playframework,playframework-2.4,Playframework,Playframework 2.4,因此,我试图用如下方式实现编译时DI: package modules class MyModule extends AbstractModule { def configure() { bind(classOf[MyT]).to(classOf[MyTImpl]) } } class MyApplicationLoader extends GuiceApplicationLoader { override protected def builder(context: A

因此,我试图用如下方式实现编译时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)
....

我不明白这为什么不起作用,因为我所看到的例子中没有一个比这更重要。我忽略了什么?

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

MyModule application.conf
因为
MyTImpl
将作为单例加载,所以它必须没有实例绑定数据。想想scala术语中的
对象
。始终会注入完全相同的
MyTImpl
实例。

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

MyModule application.conf
因为
MyTImpl
将作为单例加载,所以它必须没有实例绑定数据。想想scala术语中的
对象
。始终会注入完全相同的
MyTImpl
实例。

使用
绑定
而不是
加载

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)
  }
}

使用
绑定
而不是
加载

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)
  }
}

这只是一个很小的例子。我需要使用不同的绑定,这取决于应用程序是在Prod模式还是在Dev模式下(因为我们正在模拟服务,因为它们通常在Dev模式下不可用),而且最好不需要开发人员手动在不同的conf文件之间切换。使用play.modules.enabled无法实现这一点(至少据我所知)。使用绑定(..)就像我预期的那样工作,我们能够在加载程序中设置一个案例来处理不同的案例。@MichaelA。DI的优点之一,如果不说核心特性的话,就是在不接触代码的情况下将应用程序连接在一起。您描述的用例正是DI的用途。你读过了吗?这只是一个很小的例子。我需要使用不同的绑定,这取决于应用程序是在Prod模式还是在Dev模式下(因为我们正在模拟服务,因为它们通常在Dev模式下不可用),而且最好不需要开发人员手动在不同的conf文件之间切换。使用play.modules.enabled无法实现这一点(至少据我所知)。使用绑定(..)就像我预期的那样工作,我们能够在加载程序中设置一个案例来处理不同的案例。@MichaelA。DI的优点之一,如果不说核心特性的话,就是在不接触代码的情况下将应用程序连接在一起。您描述的用例正是DI的用途。你读了吗?
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)
  }
}