Scala - 当依赖项 class 也使用相同的通用类型时使用 guice 注入通用类型
Scala - Injecting Generic type using guice when dependency class is also using same generic type
我想使用 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 类型。
当你创建 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()
我想使用 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 类型。
当你创建 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()