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

时间:2018-06-13 06:31:06

标签: scala generics dependency-injection guice

我想使用Guice为Generic类型注入依赖。在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 Type。

1 个答案:

答案 0 :(得分:5)

当时您创建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()