2016-11-07 18 views
2

したがって、PlayFrameworkアプリケーションをバージョン2.4.3から2.5.6に移行しようとしています。私はSquerylakka-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と熱心 を呼び出し、そしてどのようにそれを修正する必要がありますされていませんか?

  • これは、この種の機能をロードするための標準的な方法ですか、別の方法で使用する必要がありますか?

+3

[ここ](https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Programmatic-bindings)(「再生」を参照)で説明したように、 'application.conf'で' CustomModule'を有効にしていますか? modules.enabled')?また、あなたが結んでいるGuiceモジュールはもう必要ないと思います。 – marcospereira

+2

文書はこう言っています: "このモジュールを**モジュール**と呼んで**ルートパッケージ**に入れると、それは自動的にプレイに登録されます。"それ以外の場合は、 'application.conf'に手動で登録する必要があります。 –

答えて

1

だから、基本的なコメントが正しいとドキュメントはそう

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

が助けを含め、ちょうど期限が切れました。私もそれを試みたと思ったが、私はしなかった。コメントだけに答えて、それを受け入れることはできません。

関連する問題