在 scala main 中将对象注入 App

Inject object into App in scala main

代码如下:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.Sink
import com.google.inject.Inject
import org.bytedeco.javacv.{CanvasFrame, Frame}

class WebCamWindow @Inject()(webCam: WebCam) {

  implicit val system = ActorSystem()
  implicit val materializer = ActorMaterializer()

  val canvas = new CanvasFrame("Webcam")
  //  Set Canvas frame to close on exit
  canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE)

  val imageDimensions = Dimensions(width = 640, height = 480)
  val webcamSource = webCam.source

  val graph = webcamSource
    .map(MediaConversion.toMat) // most OpenCV manipulations require a Matrix
    .map(Flip.horizontal)
    .map(MediaConversion.toFrame) // convert back to a frame
    .map(canvas.showImage)
    .to(Sink.ignore)

  def run(): Unit = {
    graph.run()
  }
}

我想把它做成一个App对象运行,但我不知道如何处理这里的依赖注入。有人可以帮忙吗?

完整的项目可以在这里找到:https://bitbucket.org/kindlychung/testscalacv

第一步是把它变成一个特征(只是为了方便):

trait WebCamWindowLike  {
   def webCam: WebCam

   implicit val system ...//all the code is here

}

那你就可以用老针了WebCamWindow:

class WebCamWindow @Inject()(val webCam: WebCam) extends WebCamWindowLike

以及独立的可运行对象:

object WebCamWindowApp extends App with WebCamWindowLike {
   private val injector = Guice.createInjector(new AppInjectory())
   override val webCam = injector.getInstance(classOf[WebCam])
   run()
}

其中 AppInjectory extends AbstractModule 是您对 Guice 的实际注入,它负责处理您的所有依赖项。

另一种选择是(如果你想摆脱 Guice)手动 "injection":

object WebCamWindowApp extends App with WebCamWindowLike {

   override val webCam = new WebCam(...)
   run()

}