Playframework 2.0 播放:获取到默认数据库的连接

Playframework 2.0 播放:获取到默认数据库的连接,playframework-2.0,Playframework 2.0,在application.conf中编写此文件时,我希望获得与我定义的数据库实例的连接: 他们说我们应该将db:Database注入控制器(工作正常),并且没有显示其他方式。它的预定义Guice注入是隐藏的(不在Module.scala中)。它还建议通过Play自动创建默认的数据库singleton 如果我不想将数据库注入控制器,而是分离关注点并仅在某些SqlHandler对象中使用它,而该对象的唯一任务是执行SQL查询,该怎么办 object SqlHandler { val db: Da

在application.conf中编写此文件时,我希望获得与我定义的数据库实例的连接:

他们说我们应该将
db:Database
注入控制器(工作正常),并且没有显示其他方式。它的预定义Guice注入是隐藏的(不在Module.scala中)。它还建议通过Play自动创建默认的数据库singleton

如果我不想将数据库注入控制器,而是分离关注点并仅在某些
SqlHandler
对象中使用它,而该对象的唯一任务是执行SQL查询,该怎么办

object SqlHandler {
  val db: Database = ???
  def select(params) {...db...}
  def insert(params) {...db...}
}
我知道我可以创建一个新的数据库实例

import play.api.db.Databases
val db: Database = Databases(
  driver = "com.mysql.jdbc.Driver"
  url = "jdbc:mysql://localhost/test"
  username = ...
  password = ...
)
但我不仅觉得重复所有信息很愚蠢,我相信它还会创建两次数据库(一次自动创建,一次手动创建,不是吗?)


是否有任何方便的方法来获取到默认数据库的连接,或者如何使用Guice将其注入到其他地方?

此答案假设您希望将
SqlHandler
注入控制器

如果是这样,您可以在控制器中执行此操作:-

class Application @Inject() (sql: SqlHandler) extends Controller {

  def index = Action { implicit request =>
    ...    
    sql.someSQLHandlerBehaviour()
    ...
  }
}
由于控制器是由Guice开箱即用地管理的,因此任何注射剂也将属于Guice生命周期管理的范围。因此,您应该能够如上所述将
SqlHandler
注入控制器

由于您的
SqlHandler
现在由Guice管理,您可以像这样将
jdbc
依赖项注入
SqlHandler

@Singleton
class SqlInjector @Inject() (db: Database) { ... }

对不起,我还是不明白。我想在中使用数据库的是
SqlHandler
,而不是一些新的
DBTest
。嗨,这只是一个例子。为了清晰起见,我编辑了我的文章。重要的一点是,您(A)了解,只要注入器和被注入器由Guice管理,您就可以在任何地方注入依赖项。(B) 如果您只需要一个实例,您可以在类上使用
@Singleton
,而不是尝试注入到
对象中,这将需要更多的里程数。好的。现在我应该在任何地方注入SqlHandler而不是数据库,对吗?如果我只是执行
new SqlHandler
操作,它会抱怨它需要一个数据库参数。我可以将数据库注入SqlHandler中,但如果不提供数据库作为参数(“构造函数SqlHandler的参数不足。未指定值参数db”),朱利安,我只是仔细检查了一个有效的例子,并编辑了我以前的答案,因为它有点误导。我用的是播放2.5.8。基本上,DI的全部要点是您自己不实例化任何依赖项,框架提供了它们,即不做
新的SqlHandler
,您注入它,这将是一个可以使用的实例。
@Singleton
class SqlInjector @Inject() (db: Database) { ... }