【问题标题】:Play 2.5 Dependency Injection for play-slick Database ConfigurationPlay 2.5 play-slick 数据库配置的依赖注入
【发布时间】:2016-10-19 21:25:09
【问题描述】:

我正在尝试使用play-slick 插件与mySQL 数据库进行交互。除了[warn] 之外,一切都按预期工作,我每次编译代码时都会得到。

在这条线上:val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)

警告是:method current in object Play is deprecated: This is a static reference to application, use DI instead

我尝试通过使用依赖注入定义配置来添加注入()方法,但它不起作用!如何在以下代码中使用Dependency Injection,这样我就不必使用自Play 2.5 以来已弃用的Play.current

import play.api.Play
import play.api.db.slick.DatabaseConfigProvider
import scala.concurrent.Future
import slick.driver.JdbcProfile
import slick.driver.MySQLDriver.api._
import scala.concurrent.ExecutionContext.Implicits.global


case class User(
    id: Long, 
    firstName: String, 
    lastName: String, 
    mobile: Long, 
    email: String
)

class UserTableDef(tag: Tag) extends Table[User](tag, "users") {

  def id = column[Long]("id", O.PrimaryKey,O.AutoInc)
  def firstName = column[String]("first_name")
  def lastName = column[String]("last_name")
  def mobile = column[Long]("mobile")
  def email = column[String]("email")

  override def * =
    (id, firstName, lastName, mobile, email) <>(User.tupled, User.unapply)
}

object Users {

  val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current) //<-- PROBLEM

  val users = TableQuery[UserTableDef]

  def get(id: Long): Future[Option[User]] = {
    dbConfig.db.run(users.filter(_.id === id).result.headOption)
  }

}

【问题讨论】:

    标签: mysql scala playframework slick play-slick


    【解决方案1】:

    Play current 已弃用。 DBConfigProvider 将使用 guice 注入。

    DatabaseConfigProvider 将使用 guice 依赖注入注入到 UsersRepo 类中。

    这是使用 Guice and Play 2.5 的方法

    case class User(profileName: ProfileName,
                    email: Email,
                    createdAt: DateTime,
                    id: UserId)
    
    @Singleton
    class UsersRepo @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) {
      val dbConfig = dbConfigProvider.get[JdbcProfile]
    
      import dbConfig.driver.api._
    
      private[services] val users = TableQuery[Users]
    
      def exists(id: UserId): DBIO[Boolean] = {
        users.filter(_.id === id).exists.result
      }
    
    
      private[services] class Users(tag: Tag) extends Table[User](tag, UsersTable.name) {
        def profileName = column[ProfileName]("profile_name")
    
        def id = column[UserId]("user_id", O.PrimaryKey)
    
        def email = column[Email]("email")
    
        def createdAt = column[DateTime]("created_at")
    
        def * = (profileName, email, source, createdAt, id) <> (User.tupled, User.unapply)
    
        def emailIndex = index("users_email_index", email, true)
      }
    
    }
    

    在 application.conf 中使用play-slick 时的数据库配置

    slick.dbs.default.driver="slick.driver.PostgresDriver$"
    slick.dbs.default.db.driver="org.postgresql.Driver"
    slick.dbs.default.db.url="jdbc:postgresql://ec2-54-217-243-228.eu-west-1.compute.amazonaws.com:5432/d344onl0761ji5?user=user&password=pass"
    slick.dbs.default.db.user=user
    slick.dbs.default.db.password="pass"
    

    【讨论】:

    • 如何从另一个类调用exists()方法?
    • @summerNight .... 将用户 repo 注入另一个类并使用它。阅读 play 2.5 并指导依赖注入
    • @f.g: 如何从另一个对象调用exists() 方法。因为不能对对象进行注入。
    • @SumitPaliwal 注入 usersrepo 并使用它的方法
    • @SumitPaliwal 您不能在 object 中使用它。所以声明一个类并使用单例注释使其成为单例
    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多