迁移 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
.
所以基本上问题是:
为什么 CustomModule
不调用 configure()
方法并且急切
正在加载 Classes,应该如何修复?
这是加载此类功能的标准方式,还是应该使用其他方式?
所以基本上评论是正确的,文档刚刚过时,所以包括
play.modules.enabled += "module.CustomModule"
有帮助。以为我也尝试过,但事实证明我没有。回复只是评论所以不能接受。
所以我正在尝试将 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
.
所以基本上问题是:
为什么
CustomModule
不调用configure()
方法并且急切 正在加载 Classes,应该如何修复?这是加载此类功能的标准方式,还是应该使用其他方式?
所以基本上评论是正确的,文档刚刚过时,所以包括
play.modules.enabled += "module.CustomModule"
有帮助。以为我也尝试过,但事实证明我没有。回复只是评论所以不能接受。