У меня проблемы с пониманием базовой идеи инъекции зависимостей. (Я использую Play 2.5 с модулем play-slick). У меня есть класс Users
, которому требуется подключение к базе данных.В чем смысл инъекции зависимостей, если вам все еще нужно передать аргумент?
package models
@Singleton
class Users @Inject() (dbConfigProvider: DatabaseConfigProvider) {
private val db = dbConfigProvider.get[JdbcProfile].db
private val users = TableQuery[UserTable]
private val setupAction = DBIO.seq(users.schema.create)
private val setupFuture: Future[Unit] = db.run(setupAction)
def getAll(): Future[Seq[User]] = setupFuture.flatMap(_ =>
db.run(users.result)
)
// More methods like the previous
}
Когда у меня есть мнение, что нужно, чтобы получить доступ к этим методам, я бы ожидать, что система впрыска топлива зависимости, чтобы заполнить dbConfigProvider
зависимости для меня, как это.
package views
class UserSearch {
def index(implicit ec: ExecutionContext): Future[String] = Future(
(new Users).getAll().map(seq => seq.map(user => user.name).mkString(" "))
)
}
Однако это дает мне ошибку компиляции, и я вынужден сделать dbConfigProvider
зависимость моего зрения и передать его в явном виде. В этом случае я, наконец, получаю dbConfigProvider
от контроллера, вызывающего представление.
package views
class UserSearch @Inject (dbConfigProvider: DatabaseConfigProvider) {
def index(implicit ec: ExecutionContext): Future[String] = Future(
(new Users(dbConfigProvider)).getAll().map(seq =>
seq.map(user => user.name).mkString(" "))
)
}
Я предполагаю, что я неправильно понял, как должна работать инъекция зависимости.
Так мои вопросы заключаются в следующем:
Какой смысл использования
@Inject()
ключевое слово в моей моделиUsers
тогда?Является ли мой дефект дизайна дефектным? Мне бы хотелось, чтобы
Users
иUserSearch
были объектами, но тогда я не могу использовать им зависимость.В случае, если кто-либо знаком с Slick, это мой метод
getAll()
метод propper для работы с пятнами? Это даже правильный способ написать асинхронный код?
'UserSearch' должен вводить« Пользователи », а не« DatabaseConfigProvider », которые« нужны пользователям ». Нет причин, по которым «UserSearch» должен знать об этом. –
@MichaelZajac Спасибо, но тогда я бы каждый раз создавал экземпляр «новых пользователей» в методе Action моего контроллера? – rusins
Нет, структура DI должна создавать все зависимости для вас. Если вам нужно использовать «Пользователи» в вашем контроллере, его следует ввести в контроллер. –