Scala 有没有一种很好的Play2方法可以用Guice在Play插件中注入实例

Scala 有没有一种很好的Play2方法可以用Guice在Play插件中注入实例,scala,playframework,guice,playframework-2.2,Scala,Playframework,Guice,Playframework 2.2,我正试图弄清楚如何将我的类与GoogleGuice一起注入play.api.Plugin。 我已经实现了Guice来与我的控制器一起工作,它工作得非常好 我使用: "com.google.inject" % "guice" % "4.0-beta", "com.tzavellas" % "sse-guice" % "0.7.1" 当需要控制器实例时,全局中的getControllerInstance方法将通过注入器加载适当的实现 全球: object Global extends Global

我正试图弄清楚如何将我的类与GoogleGuice一起注入play.api.Plugin。 我已经实现了Guice来与我的控制器一起工作,它工作得非常好

我使用:

"com.google.inject" % "guice" % "4.0-beta",
"com.tzavellas" % "sse-guice" % "0.7.1"
当需要控制器实例时,全局中的getControllerInstance方法将通过注入器加载适当的实现

全球:

object Global extends GlobalSettings {

  /**
   * Currently we only want to load a different module when test.
   */
  private lazy val injector = {
    Logger.info("Is Test: "+Play.isTest)

    Play.isTest match {
      case true => Guice.createInjector(new TestModule)
      case false => Guice.createInjector(new CommonModule)
    }
  }    

  override def onStart(app: Application) {
    Logger.info("Application has started")
  }

  override def onStop(app: Application) {
    Logger.info("Application shutdown...")
  }

  override def getControllerInstance[A](clazz: Class[A]) = {
    Logger.info("getControllerInstance")
    injector.getInstance(clazz)
  }    
}
package modules

import com.tzavellas.sse.guice.ScalaModule
import services.{CallServiceImpl, CallService}

/**
 * User: jakob
 * Date: 11/5/13
 * Time: 10:04 AM
 */
class CommonModule extends ScalaModule {
  def configure() {
    bind[CallService].to[CallServiceImpl]
  }
}

class TestModule extends ScalaModule {
  def configure() {
    // Test modules!
  }
}
@Singleton
class StatsController @Inject()(callService: CallService) extends Controller with securesocial.core.SecureSocial with ProvidesHeader  {

    def doSomething = {
        callService.call()
    }   
}
通用:

object Global extends GlobalSettings {

  /**
   * Currently we only want to load a different module when test.
   */
  private lazy val injector = {
    Logger.info("Is Test: "+Play.isTest)

    Play.isTest match {
      case true => Guice.createInjector(new TestModule)
      case false => Guice.createInjector(new CommonModule)
    }
  }    

  override def onStart(app: Application) {
    Logger.info("Application has started")
  }

  override def onStop(app: Application) {
    Logger.info("Application shutdown...")
  }

  override def getControllerInstance[A](clazz: Class[A]) = {
    Logger.info("getControllerInstance")
    injector.getInstance(clazz)
  }    
}
package modules

import com.tzavellas.sse.guice.ScalaModule
import services.{CallServiceImpl, CallService}

/**
 * User: jakob
 * Date: 11/5/13
 * Time: 10:04 AM
 */
class CommonModule extends ScalaModule {
  def configure() {
    bind[CallService].to[CallServiceImpl]
  }
}

class TestModule extends ScalaModule {
  def configure() {
    // Test modules!
  }
}
@Singleton
class StatsController @Inject()(callService: CallService) extends Controller with securesocial.core.SecureSocial with ProvidesHeader  {

    def doSomething = {
        callService.call()
    }   
}
控制器:

object Global extends GlobalSettings {

  /**
   * Currently we only want to load a different module when test.
   */
  private lazy val injector = {
    Logger.info("Is Test: "+Play.isTest)

    Play.isTest match {
      case true => Guice.createInjector(new TestModule)
      case false => Guice.createInjector(new CommonModule)
    }
  }    

  override def onStart(app: Application) {
    Logger.info("Application has started")
  }

  override def onStop(app: Application) {
    Logger.info("Application shutdown...")
  }

  override def getControllerInstance[A](clazz: Class[A]) = {
    Logger.info("getControllerInstance")
    injector.getInstance(clazz)
  }    
}
package modules

import com.tzavellas.sse.guice.ScalaModule
import services.{CallServiceImpl, CallService}

/**
 * User: jakob
 * Date: 11/5/13
 * Time: 10:04 AM
 */
class CommonModule extends ScalaModule {
  def configure() {
    bind[CallService].to[CallServiceImpl]
  }
}

class TestModule extends ScalaModule {
  def configure() {
    // Test modules!
  }
}
@Singleton
class StatsController @Inject()(callService: CallService) extends Controller with securesocial.core.SecureSocial with ProvidesHeader  {

    def doSomething = {
        callService.call()
    }   
}
现在我想将相同的服务注入到我的插件中,但我不能使用全局实现,因为插件没有使用getControllerInstance加载

class CallerPlugin (application: Application) extends Plugin {

  val secondsToWait = {
    import scala.concurrent.duration._
    10 seconds
  }

  val defaultInterval = 60
  val intervalKey = "csv.job.interval"
  val csvParserEnabled = "csv.job.enabled"
  val newDir = "csv.job.new.file.path"
  val doneDir = "csv.job.done.file.path"

  var cancellable: Option[Cancellable] = None

  override def onStop() {
    cancellable.map(_.cancel())
  }

  override def onStart() {

    // do some cool injection of callService here!!!

    import scala.concurrent.duration._
    import play.api.libs.concurrent.Execution.Implicits._
    val i = current.configuration.getInt(intervalKey).getOrElse(defaultInterval)

    cancellable = if (current.configuration.getBoolean(csvParserEnabled).getOrElse(false)) {
      Some(
        Akka.system.scheduler.schedule(0 seconds, i minutes) {
            callService.call()

        })
    } else None
  }
}
我想应该有一种在onStart方法中实现注入的方法,可能有一些很好的简单方法,但我无法理解。
谢谢大家!

如果我正确理解了您的问题,您会想知道如何实例化和使用Guice注入器。其实很简单:

val injector = Guice.createInjector(new CommonModule)
val callService = injector.getInstance(classOf[CallService])

这样您就有了一个
callserviceinpl
的实例。如果您查看Global.scala,这正是您在那里所做的。我没有使用Play插件,所以我不确定如何实例化它们,但我认为更惯用的方法是,不将其放入插件的
onStart
,而是将此
CallService
作为参数注入
CallerPlugin
(就像您为控制器所做的那样)。这样你就可以把依赖注入的责任传递到树上,这样理想情况下你就只有一个注入器了(可能在
Global
)。

根据我目前的发现,实现这一点的最好方法是在
Global.onStart()
中设置插件的依赖性


确保插件编号低于
10000
。Global拥有
10000
,因此,您的插件将在调用
Global.onStart()
之前启动。

我对您为什么使用插件感兴趣?我只知道这会让事情复杂化。你好!我使用插件是因为我想1。使用onStart+Akka.system.scheduler.schedule 2。我想建立一个插件的可插入注册表,以便根据潜在客户的状态插入正确的插件。DataProviderRegistry.dataProviders.get(lead.ProviderDependingInstate())我受SecureSocial及其可插拔登录提供程序系统的影响。第2点听起来很有趣。什么是DataProviderRegistry或lead?也许你能告诉我一些材料?lead是一个保存公司信息和其他信息的对象。您好!谢谢你的回答。将Callservice注入CallerPlugin正是我试图做的,但我不知道如何做=)。如前所述,我希望以某种方式使用全局。在全局中,有可能覆盖onStart和onStop,但如何进行注入?在阅读play2插件之后,我不知道如何将参数传递给插件的实例化。从本质上看,插件不想依赖于您的主逻辑。您可能仍然可以不受每个模块“拉入”依赖关系的影响。只需将我答案中的这两行内容粘贴到插件的
onStart
,您就可以在这里插入
//很酷的callService