迁移 Play Framework 2.5 - 从 Global.onStart 迁移到依赖注入

Migrating Play Framework 2.5 - moving from Global.onStart to Dependency Injection

所以我正在尝试将 PlayFramework 应用程序从版本 2.4.3 迁移到 2.5.6。我正在使用 Squeryl and akka-quartz-scheduler,Squeryl 需要手动设置一个会话,而 akka-quartz-scheduler 作为它自己的实体运行,因为其他模块的 none 确实依赖于它,尽管它会依赖于其他模块.所以之前有一个 Global-object 在启动时处理它们:

import org.squeryl.{Session, SessionFactory}
object Global extends GlobalSettings {
    private lazy val injector = Guice.createInjector(CustomModule)

    override def onStart(app: Application) {
        SessionFactory.concreteFactory = // Squeryl initialization http://squeryl.org/sessions-and-tx.html
        injector.getInstance(classOf[CustomScheduler]).initialize()
    }
}

这以前有效。但是,在 2.5.6 上,我试图完全摆脱 Global.scala。我不确定这是否是最好的方法,但是从 documentation it seems like it. So I'm trying to create Singleton classes, and load them eagerly before the application loads like instructed here as a replacement for onStart. So like instructed on eager bindings -page 我有:

import com.google.inject._

class CustomModule extends AbstractModule {
  override def configure() = { // or without override
    println("configure called")
    bind(classOf[SquerylInitialization]).to(classOf[SquerylInitialization]).asEagerSingleton()
    bind(classOf[CustomScheduler]).to(classOf[CustomScheduler]).asEagerSingleton()
  }
}


import play.api.{Configuration, Application}
import play.api.db.{DB, DBApi}
import org.squeryl.{SessionFactory, Session}
@Singleton
class SquerylInitialization @Inject()(conf: Configuration, dbApi: DBApi) extends Logging {
     SessionFactory.concreteFactory = // Squeryl initialization http://squeryl.org/sessions-and-tx.html
}


import akka.actor.{ActorSystem, ActorRef}
@Singleton
class CustomScheduler @Inject()(system: ActorSystem) extends Logging {
    val scheduler: QuartzSchedulerExtension = QuartzSchedulerExtension(system)
    // other initialize code here
}

继承AbstractModule 及其configure() 方法的CustomModule 永远不会被调用。在Guice documentation中表示"Alternatively, play will scan the classpath for classes that implement AbstractModule"。文档可能不是最新的,但这似乎是它的工作方式。

例如,如果在所有 类 使用 Squeryl 的情况下,我使用依赖注入来加载 SquerylInitialization 它可以工作,但我不确定这是否是一个好方法,因为它必须是大量 Classes 需要,但几乎没有 Class 取决于 CustomScheduler.

所以基本上问题是:

所以基本上评论是正确的,文档刚刚过时,所以包括

play.modules.enabled += "module.CustomModule"

有帮助。以为我也尝试过,但事实证明我没有。回复只是评论所以不能接受。