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 ответ:
Когда вы создаете экземпляр 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()