Scala 中的 Guice:class 本身具有 DI 构造函数的模块
Guice in Scala: Module for a class that has a DI-constructor itself
我正在使用 codingwell/scala-guice
并尝试将 DAO-classes 注入到其他 components/classes.
的构造函数中
第一次尝试,我只用了一个DAO-class看看是否可行:
class DaoModule extends AbstractModule with ScalaModule {
override def configure() {
val dao1 = new FirstDaoImpl
bind(new TypeLiteral[FirstDaoTrait] {}).toInstance(dao1)
}
}
绑定按预期工作,可用于构造函数注入。
在第二步中,我想在模块中添加另一个 DAO class。但是,那个 DAO-class 依赖于第一个 DAO:
class SecondDaoImpl @Inject()(firstDao: FirstDaoTrait) extends SecondDaoTrait
我不确定如何向现有模块添加必要的绑定。重复第一步将导致:
val dao2 = new SecondDaoImpl(???)
bind(new TypeLiteral[SecondDaoTrait] {}).toInstance(dao2)
但是当然这个 class 只能通过提供第一个 DAO(因此是“???”)来实例化。我该怎么做?
使用 bind
并让 scala-guice 为您解决依赖关系:
class DaoModule extends AbstractModule with ScalaModule {
override def configure() {
bind[FirstDaoTrait].to[FirstDaoImpl]
bind[SecondDaoTrait].to[SecondDaoImpl]
}
}
现在使用注射器:
val injector = Guice.createInjector(new DaoModule())
val secondDao = injector.instance[SecondDaoTrait]
我正在使用 codingwell/scala-guice
并尝试将 DAO-classes 注入到其他 components/classes.
第一次尝试,我只用了一个DAO-class看看是否可行:
class DaoModule extends AbstractModule with ScalaModule {
override def configure() {
val dao1 = new FirstDaoImpl
bind(new TypeLiteral[FirstDaoTrait] {}).toInstance(dao1)
}
}
绑定按预期工作,可用于构造函数注入。
在第二步中,我想在模块中添加另一个 DAO class。但是,那个 DAO-class 依赖于第一个 DAO:
class SecondDaoImpl @Inject()(firstDao: FirstDaoTrait) extends SecondDaoTrait
我不确定如何向现有模块添加必要的绑定。重复第一步将导致:
val dao2 = new SecondDaoImpl(???)
bind(new TypeLiteral[SecondDaoTrait] {}).toInstance(dao2)
但是当然这个 class 只能通过提供第一个 DAO(因此是“???”)来实例化。我该怎么做?
使用 bind
并让 scala-guice 为您解决依赖关系:
class DaoModule extends AbstractModule with ScalaModule {
override def configure() {
bind[FirstDaoTrait].to[FirstDaoImpl]
bind[SecondDaoTrait].to[SecondDaoImpl]
}
}
现在使用注射器:
val injector = Guice.createInjector(new DaoModule())
val secondDao = injector.instance[SecondDaoTrait]