Итак, я пытаюсь перенести приложение PlayFramework с версии 2.4.3 на 2.5.6. Я использую Squeryl и akka-quartz-scheduler, а Squeryl требует настройки сеанса вручную, а akka-quartz-scheduler запускается как его собственный объект, так как ни один из других модулей не зависит от него, хотя он будет зависеть от других. Таким образом, ранее имело место Global
-объекта, чтобы справиться с ними при запуске:Migrating Play Framework 2.5 - переход от Global.onStart к вложению зависимостей
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 кажется, что он. Поэтому я пытаюсь создать классы Singleton и загружать их с нетерпением до загрузки приложения, как указано here в качестве замены для onStart
. Так как указание на 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
}
CustomModule
наследуя AbstractModule
и его configure()
-метод не называется. В Guice documentation сказано: «В качестве альтернативы игра будет проверять путь класса для классов, реализующих AbstractModule». Документация может быть не самой последней, но похоже, что она работает.
Если, например, для всех классов с использованием Squeryl я использую инъекцию зависимостей для загрузки SquerylInitialization
, это работает, но я не уверен, что это хороший способ сделать это, как это требовалось бы тонны Классам, и есть вряд ли какой-либо класс в зависимости от CustomScheduler
.
Так в основном вопросы являются:
Почему не
CustomModule
вызоваconfigure()
-метода и нетерпеливый загрузки классов, и как это должно быть исправлено?Является ли это стандартным способом загрузки такого рода функций или каким-либо другим способом?
Включите ли вы свой 'CustomModule' в' application.conf', как описано [здесь] (https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Programmatic-bindings) (ищите 'play. modules.enabled')? Кроме того, я не думаю, что модуль Guice, который вы связали, больше необходим. – marcospereira
Документы говорят: «Если вы вызываете этот модуль ** Модуль ** и поместите его в ** корневой пакет **, он будет автоматически зарегистрирован в Play.». Кроме того, вы должны зарегистрировать его вручную в 'application.conf'. –