在 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()
}
代码如下:
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()
}