如何为具有依赖注入的 类 提供 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
}
这是 Car
和 CarsUtilities
的样子:
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".
我有一个不同的汽车对象,例如:
object Porsche extends Car with CarsUtilities {
override def start() {...}
override def canStart(fuelInLitr: Int) = fuelInLitr > 5
override val fuelInLitr = 45
override val carId = 1234567
}
这是 Car
和 CarsUtilities
的样子:
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 :)
通常,依赖注入和对象不能一起工作。请参阅
您可能需要的是某种业务服务,它是一种 class 可以注入控制器的业务服务,如下所示:
class CarsUtilities @Inject() (carApiService: CarApiService, carSupplierApiService: CarSupplierApiService) {
// this class implements all the business logic and can use the services
def prepareResult() = {}
}
在控制器中,您也可以注入此 CarsUtilities
,因为依赖注入 "propagates".