迁移Play Framework 2.5 - 从Global.onStart迁移到依赖注入

时间:2016-11-07 16:34:41

标签: scala playframework guice playframework-2.5 squeryl

所以我试图将PlayFramework应用程序从版本2.4.3迁移到2.5.6。我正在使用Squerylakka-quartz-scheduler,Squeryl需要手动设置会话,而akka-quartz-scheduler作为自己的实体运行,因为其他模块都没有真正依赖它,尽管它依赖于它在别人身上。所以以前有一个Global - 对象在启动时处理它们:

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中说“或者,play将扫描实现AbstractModule的类的类路径”。文档可能不是最新的,但这似乎是它的工作方式。

例如,如果在使用Squeryl的所有类上使用依赖注入来加载SquerylInitialization它可以工作,但是我不确定这是否是好方法,因为它需要大量的类,并且几乎没有任何类别取决于CustomScheduler

基本上问题是:

  • 为什么CustomModule调用configure() - 方法并不热切 加载类,以及如何修复它?

  • 这是加载此类功能的标准方式,还是应该采用其他方式?

1 个答案:

答案 0 :(得分:1)

所以基本上评论是正确的,文档刚刚过时,所以包括

// app 1.3.9 declarations
(function() {

  angular.module('app139', [])
    .run(function($rootScope, $window) {
      $rootScope.version = $window.angular.version;
    });

  angular.element(document).ready(function() {

    var element = angular.element(document.getElementById('app139'));
    angular.bootstrap(element, ['app139']);
  });

})();

// app 1.5.7 declarations
(function(angular) {

  angular.module('app157', [])
    .config(function($provide) {

      $provide.decorator('$window', function $windowDecorator($delegate) {

        return new Proxy($delegate, {
          get: function(target, prop) {
            return prop == 'angular' ?
              window.angular1_5_7 :
              target[prop]
          }
        });
      });
    })
    .run(function($rootScope, $window) {
      $rootScope.version = $window.angular.version;
    });

  angular.element(document).ready(function() {

    var element = angular.element(document.getElementById('app157'));
    angular.bootstrap(element, ['app157']);
  });

})(window.angular1_5_7);

帮助。以为我也试过了,但事实证明我并没有。回答一个评论,所以不能接受。