Scala-инъекция универсального типа с использованием guice, когда класс зависимостей также использует тот же универсальный тип


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

Модель продукта.scala

trait BaseProduct  

case class Product() extends BaseProduct 

Обслуживание телег.scala

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

ProductService.scala

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

Главная.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.приложение скала получаю ниже ошибка.

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

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

1 5

1 ответ:

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

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

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

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

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

val injector = Guice.createInjector()