/ / Грайте зі скалою - Впорскування залежностей через екземпляр Guice Injector - шкала, ігровий кадр, підказки

Грати з scala - ін'єкційні залежності через екземпляр Guice Injector - scala, playframework, guice

Моя програма використовує: Play-2.4.2 / Scala-2.11.6 що постачається із вбудованою підтримкою Guice для DI

Усі мої DAO пов'язують реалізацію з інтерфейсом, як показано нижче, що, як передбачається, є найпростішим способом у Guice

@ImplementedBy(classOf[PersonDAOImpl])
trait PersonDAO {
}

class PersonDAOImpl @Inject()
(
(@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider,
protected val cache : CacheApi) extends PersonDAO with SQLWrapper {
..
...

}

Вищеописана реалізація не потребує додавання жодного модуля для забезпечення прив'язки.

Тепер чомусь я не хочуть вводити залежності в конструктор класу Книги за допомогою анотації @Inject . Отже, я спробував ввести його як нижче

class Books {

val injector = Guice.createInjector()

val personDAO : PersonDAO = injector.getInstance(classOf[PersonDAOImpl])

..
...

}

Але це додає мені виключення з конфігурації Guice:

Caused by: com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for play.api.cache.CacheApi was bound.
while locating play.api.cache.CacheApi
for parameter 1 at schema.PersonDAOImpl.<init>
while locating PersonDAO

2)  No implementation for play.api.db.slick.DatabaseConfigProvider annotated with @play.db.NamedDatabase(value=mysql) was bound.
while locating play.api.cache.CacheApi
for parameter 2 at schema.PersonDAOImpl.<init>  while locating PersonDAO

Що зараз потрібно зробити? Правильний чи неправильний в цьому випадку мій підхід? Хтось може мені допомогти у цьому? Заздалегідь спасибі.

Відповіді:

3 для відповіді № 1

Ви можете скористатись Інжектор з поточної Play Застосування.

import play.api.{ Application, Play }
import play.api.inject.Injector

val currentApp: Application = Play.current
val injector: Injector = currentApp.injector
// in short play.api.Play.current.injector

// Then use the injector
import play.api.inject.ApplicationLifecycle
current.injector.instanceOf[ApplicationLifecycle].
addStopHook { () => ??? }

(Див. Приклад використання injector з Відтворити плагін для ReactiveMongo)