@tasce

Как внедрить зависимость БД в объект?

Изучаю версию 2.5. Она вся построена на внедрении зависимостей, а документация не обновлена. Для работы с БД использую Anorm:

case class User(id: Long, login: String, password: String, email: String )

object User {
def login(email: String, password: String): Option[User] = {
    DB.withConnection { implicit c =>
      // TODO
    }
  }
}


Раньше DB был простым объектом play.api.db.DB , сейчас он помечен @deprecated "Inject DBApi into your component".

Вопрос: как внедрить зависимость в объект? Или надо менять структуру моделей? С внедрением зависимостей в контроллеры я разобрался. А вот тут зашел в тупик. Не в контроллере же работать с БД.
  • Вопрос задан
  • 150 просмотров
Решения вопроса 2
mrRontgen
@mrRontgen
Scala lover.
Попробуйте так
class UserApi @Inject() (db:  play.api.db.DBApi ) {
  val dababase = db.database("name")

   def login(email: String, password: String): Option[User] = {
    dababase.withConnection { implicit c =>
      // TODO
     }
    }
}

//controller 

class MyController @Inject() (userApi: UserApi ) extends Conroller {
 //your code
}
Ответ написан
@tasce Автор вопроса
Я нашел способ, как оставить объект в покое. Но этот способ больше похож на костыль:
object User {
  def login(email: String, password: String)(implicit DB: Database): Option[User] = {
    DB.withConnection { implicit c =>
      // TODO
    }
  }
}

class Application @Inject() (implicit DB: Database) extends Controller {
  def index = Action { User.login(/**/) }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы