如何为具有依赖注入的 类 提供 scala 对象?

How to provide scala object's with classes that have dependancy injection?

我有一个不同的汽车对象,例如:

object Porsche extends Car with CarsUtilities {
   override def start() {...}
   override def canStart(fuelInLitr: Int) = fuelInLitr > 5

   override val fuelInLitr = 45
   override val carId = 1234567
}

这是 CarCarsUtilities 的样子:

trait Car {
  def start(): Unit
  val canStart(fuel: Double): Boolean
  val fuelInLitr: Int
  val carId: Int
}

trait CarsUtilities {
  // method to prepare start() result
  def prepareResult() = {...}
}

我有两个 api 服务:

class CarApiService (wsClient: WSClient, configuration: Configuration) {

  def getCarkey(carId: String): Future[Option[CarKey]] = {
    // here im performing api call using wsclient
  }

}

class CarSupplierApiService @Inject()(configuration: Configuration) {

  def getSupplierInfo(carId: String): Future[Option[SupplierInfo]] = // here im performing elastic search api call

}

现在,在一些汽车对象中,可以说其中 50% 将使用这些 api 服务,有时两者都使用,有时只是其中之一。为那些汽车对象提供那些服务实例的最佳实践是什么?

我真的不想使用 new 为每个需要使用它们的对象创建它们的实例...所以我想也许可以懒惰地将它们添加到 CarsUtilities 所以所有汽车对象将在需要时访问这些 api 服务...这是一个好的解决方案吗?

此外,如果我这样做,我该如何进行配置和 WSClient 注入?

trait CarsUtilities {
  lazy val carApiService = new CarApiService(???)
  lazy val carSupplierApiService = new CarSupplierApiService(???)
  // method to prepare start() result
  def prepareResult() = {...}
}

谢谢!!

使用 playframework 2.6、scala 2.11.8 :)

通常,依赖注入和对象不能一起工作。请参阅 ,但从长远来看,您希望摆脱依赖注入 classes 的对象。

您可能需要的是某种业务服务,它是一种 class 可以注入控制器的业务服务,如下所示:

class CarsUtilities @Inject() (carApiService: CarApiService, carSupplierApiService: CarSupplierApiService) {

  // this class implements all the business logic and can use the services
  def prepareResult() = {}

}

在控制器中,您也可以注入此 CarsUtilities,因为依赖注入 "propagates".