【发布时间】:2017-11-28 18:02:55
【问题描述】:
我正在尝试获取特征(接口)的所有实例子类。此 trait 有多种实现,由第三方用户提供。
这是否可能在没有显式绑定的情况下获取所有实例子类,因为我没有控制权,由第三方用户提供的实现。 ?
我已经看到了相同的question,您需要在其中显式绑定。
代码示例:
import javax.inject.Inject
import com.google.inject._
import scala.collection.JavaConversions._
object DemoApp extends App {
val injector = Guice.createInjector(new AllImplModule)
injector.getInstance(classOf[Action]).perform()
}
class Action @Inject()(impls: List[B]) {
def perform() = {
impls.foreach(b => println(b.name))
}
}
class AllImplModule extends AbstractModule {
override def configure() = {
bind(classOf[Action]).asEagerSingleton()
}
@Provides
@Singleton
def getAllImpls(injector: Injector): List[B] = {
injector.getAllBindings().keySet().collect {
case key: Key[_] if (classOf[B].isAssignableFrom(key.getTypeLiteral().getRawType())) =>
injector.getInstance(key).asInstanceOf[B]
}.toList
}
}
trait B {
def name: String
}
class C1 extends B {
override def name: String = "C1"
}
class C2 extends B {
override def name: String = "C2"
}
这不起作用。任何帮助,将不胜感激!
【问题讨论】:
标签: scala dependency-injection guice