2016-04-18 4 views
2

Я использую codingwell/scala-guice и пытаюсь ввести DAO-классы в конструкторы других компонентов/классов.Guice in Scala: модуль для класса с самим DI-конструктором

В первой попытке, я использовал только один DAO-класс, чтобы увидеть, если он работает:

class DaoModule extends AbstractModule with ScalaModule { 
    override def configure() { 
    val dao1 = new FirstDaoImpl 
    bind(new TypeLiteral[FirstDaoTrait] {}).toInstance(dao1) 
    } 
} 

связывания работает как и ожидалось, он может быть использован для инъекций конструктора.

На втором этапе я хотел добавить в модуль еще один класс DAO. Тем не менее, что DAO-класс зависит от первого DAO:

class SecondDaoImpl @Inject()(firstDao: FirstDaoTrait) extends SecondDaoTrait 

Я не уверен, как добавить необходимые привязки к существующему модулю. Повторив первый шаг приведет в этом:

val dao2 = new SecondDaoImpl(???) 
bind(new TypeLiteral[SecondDaoTrait] {}).toInstance(dao2) 

Но, конечно, этот класс может быть реализован только путем предоставления первого DAO (поэтому «???»). Как я могу это сделать?

ответ

2

Использование 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] 
+0

Спасибо, что работает. Таким образом, использование инжектора является альтернативой использованию инъекции конструктора? Потому что я не изменил инсталляцию конструктора и все еще работает. – fxlae

+1

@JFo Это всего лишь один из способов разрешения зависимостей и был самым простым демонстрацией :) –

Смежные вопросы