したがって、PlayFrameworkアプリケーションをバージョン2.4.3から2.5.6に移行しようとしています。私はSquerylとakka-quartz-schedulerを使用していますが、Squerylではセッションを手動で設定する必要があり、他のモジュールは実際に依存しないため、akka-quartz-schedulerは独自のエンティティとして実行されます。だから、以前に起動時にそれらを処理するためにGlobal
-objectがあった:Play Framework 2.5の移行 - Global.onStartからDependency Injectionへの移行
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からそうです。ですから、私はシングルトンクラスを作成しようとしており、onStart
の代わりにhereのようにアプリケーションがロードされる前に熱心にロードしています。私は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()
-methodを継承CustomModule
が呼び出されることはありません。 Guice documentationでは、 "代わりに、AbstractModuleを実装しているクラスのクラスパスをスキャンして再生する"と言われています。ドキュメントは最新のものではないかもしれませんが、それは動作するようです。
たとえば、Squerylを使用するすべてのクラスで依存性注入を使用してSquerylInitialization
をロードすると、それはうまくいきますが、これはクラスをたくさん必要とするため、それを行う良い方法であるかどうかはわかりませんCustomScheduler
によるとほとんどのクラスはありません。
だから、基本的な質問は以下のとおりです。
はなぜ
CustomModule
は、クラスをロードconfigure()
-methodと熱心 を呼び出し、そしてどのようにそれを修正する必要がありますされていませんか?これは、この種の機能をロードするための標準的な方法ですか、別の方法で使用する必要がありますか?
[ここ](https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Programmatic-bindings)(「再生」を参照)で説明したように、 'application.conf'で' CustomModule'を有効にしていますか? modules.enabled')?また、あなたが結んでいるGuiceモジュールはもう必要ないと思います。 – marcospereira
文書はこう言っています: "このモジュールを**モジュール**と呼んで**ルートパッケージ**に入れると、それは自動的にプレイに登録されます。"それ以外の場合は、 'application.conf'に手動で登録する必要があります。 –