2016-11-07 4 views
2

Итак, я пытаюсь перенести приложение 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() -метода и нетерпеливый загрузки классов, и как это должно быть исправлено?

  • Является ли это стандартным способом загрузки такого рода функций или каким-либо другим способом?

+3

Включите ли вы свой 'CustomModule' в' application.conf', как описано [здесь] (https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Programmatic-bindings) (ищите 'play. modules.enabled')? Кроме того, я не думаю, что модуль Guice, который вы связали, больше необходим. – marcospereira

+2

Документы говорят: «Если вы вызываете этот модуль ** Модуль ** и поместите его в ** корневой пакет **, он будет автоматически зарегистрирован в Play.». Кроме того, вы должны зарегистрировать его вручную в 'application.conf'. –

ответ

1

Так в основном комментарии являются правильными и документация была просто устаревают, поэтому в том числе

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

помог. Думал, я тоже это пробовал, но, оказывается, я этого не делал. Ответьте только на комментарий, поэтому не можете принять это.

Смежные вопросы