Scala - внедрение универсального типа с использованием guice, когда класс зависимостей также использует тот же универсальный тип - PullRequest
0 голосов
/ 13 июня 2018

Я хочу внедрить зависимость с универсальным типом, используя Guice.Найдите ниже пример в scala, который повторяет проблему.

ProductModel.scala

trait BaseProduct  

case class Product() extends BaseProduct 

CartService.scala

class CartService[A <: BaseProduct] @Inject()(productService : ProductService[A]) {
 def getCartItems = productService.getProduct
}

ProductService.scala

class ProductService[A]{
 def getProduct = println("ProductService")
}

Main.scala

object Main extends App {

  val injector = Guice.createInjector(new ShoppingModule)
  val cartService = injector.getInstance(classOf[CartService[Product]])
  cartService.getCartItems
}

class ShoppingModule extends AbstractModule with ScalaModule {
  override def configure(): Unit = {
    bind[BaseProduct].to(scalaguice.typeLiteral[Product])
  }
}

при запуске этого приложения Main.scala появляется ошибка ниже.

service.ProductService<A> cannot be used as a key; It is not fully specified.

Я попытался выполнить привязку с использованием библиотеки codingwell.Но это не помогает идентифицировать Тип ProductService.

1 Ответ

0 голосов
/ 20 июня 2018

Когда вы создаете экземпляр cartService в это время , используйте typeLiteral для создания экземпляра , как

val cartService = injector.getInstance(Key.get(scalaguice.typeLiteral[CartService[Product]])

, если вы создаете экземпляр, как указано выше, вам не нужно создавать модуль.Создать инжектор, используя модуль по умолчанию (т. Е. Полезно, если у вас есть какие-либо другие привязки в модуле Module.scala по умолчанию на уровне приложения)

val appBuilder = new GuiceApplicationBuilder()
val injector = Guice.createInjector(appBuilder.applicationModule())

, и если у вас нет какого-либо модуля, вы можете пропустить передачу модуля в качестве аргумента и создатьинжектор, не пропуская ни одного модуля, а также

val injector = Guice.createInjector()
...