Моя програма використовує: 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)