gpt4 book ai didi

scala - 有没有一种很好的 Play2 方法可以用 Guice 在 Play 插件中注入(inject)实例

转载 作者:行者123 更新时间:2023-12-01 23:24:50 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何将我的类与 Google Guice 注入(inject)到 play.api.Plugin 中。我已经实现了 Guice 来与我的 Controller 一起工作,并且效果很好。

我使用:

"com.google.inject" % "guice" % "4.0-beta",
"com.tzavellas" % "sse-guice" % "0.7.1"

当需要 Controller 实例时,Global 中的 getControllerInstance 方法将通过注入(inject)器加载适当的实现。

全局:

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!
}
}

Controller :

@Singleton
class StatsController @Inject()(callService: CallService) extends Controller with securesocial.core.SecureSocial with ProvidesHeader {

def doSomething = {
callService.call()
}
}

现在我想将相同的服务注入(inject)到我的插件中,但我无法使用全局实现,因为插件不会使用 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 方法中以某种方式实现注入(inject),并且可能有一些很好的简单方法可以做到这一点,但我无法弄清楚。谢谢!

最佳答案

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

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

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

关于scala - 有没有一种很好的 Play2 方法可以用 Guice 在 Play 插件中注入(inject)实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com