Scala - 当依赖类也使用相同的泛型类型时,使用 guice 注入(inject)泛型类型

标签 scala generics dependency-injection guice

我想使用 Guice 注入(inject)具有通用类型的依赖项。在 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 库进行绑定(bind)。但它无助于识别 ProductService 类型。

最佳答案

当您创建 cartService 实例时 使用 typeLiteral 创建实例

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

如果您像上面一样创建实例,则不需要创建模块。
使用默认模块创建注入(inject)器(即,如果您在应用程序级别的默认 Module.scala 中有任何其他绑定(bind),则很有用)
val appBuilder = new GuiceApplicationBuilder()
val injector = Guice.createInjector(appBuilder.applicationModule())

如果您没有任何模块,您可以跳过将模块作为参数传递并创建注入(inject)器而不传递任何模块以及
val injector = Guice.createInjector()

关于Scala - 当依赖类也使用相同的泛型类型时,使用 guice 注入(inject)泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830460/

相关文章:

scala - 如何在 Scala Slick 查询中否定 "inSet"?

c# - 如何从泛型类型获取命名空间?

java - 混合方法引用和泛型时出现 LambdaConversionException

unit-testing - RAD:依赖注入(inject) - 好处?

Spring注入(inject)绑定(bind)到Instance

C# - 依赖注入(inject) - 存储库层 - 调用 select

scala - 与 spark 共享变量

scala - scala.Unit 与 () 不同吗?

Scala 不可变变量和打印

java - Java如何捕获泛型接口(interface)的泛型方法中的类型变量?