Scala和Slick:独立应用程序中的DatabaseConfigProvider

时间:2016-06-09 10:27:36

标签: scala slick playframework-2.5

我有一个Play 2.5.3应用程序,它使用Slick从DB读取对象。 服务类按以下方式构建:

class SomeModelRepo @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig.driver.api._
  val db = dbConfig.db
  ...

现在我需要一些独立的Scala脚本来在后台执行某些操作。我需要连接到其中的数据库,我想重用我现有的服务类来从DB中读取对象。

要实例化SomeModelRepo类'对象,我需要传递一些DatabaseConfigProvider作为参数。我试着跑:

object SomeParser extends App {
    object testDbProvider extends DatabaseConfigProvider {
      def get[P <: BasicProfile]: DatabaseConfig[P] = {
        DatabaseConfigProvider.get("default")(Play.current)
      }
    }
    ...
    val someRepo = new SomeModelRepo(testDbProvider)

但是我在“(Play.current)”行中有一个错误:“没有启动的应用程序”。此外,对象Play中的当前方法已被弃用,应替换为DI。

有没有办法在独立对象SomeParser中初始化我的SomeModelRepo类'对象?

祝你好运

1 个答案:

答案 0 :(得分:0)

当您启动Play应用程序时,PlaySlick模块会为您处理Slick配置。有了它,你有two choices

  1. 注入DatabaseConfigProvider并从那里获取驱动程序,或
  2. 通过DatabaseConfigProvider.get[JdbcProfile](Play.current)进行全局查询,这不是首选。
  3. 无论哪种方式,您都必须运行Play应用!由于您的独立脚本不是这种情况,您会收到错误:“没有启动的应用程序”。

    因此,您必须使用Slick的默认方法,直接从config实例化db

    val db = Database.forConfig("default")
    

    你在Lightbend's templates有很多例子。

    编辑:抱歉,我没有看完整个问题。你真的需要将它作为另一个应用程序吗?您可以在应用启动时运行后台操作,例如here。在此示例中,InitialData类被实例化为eager singleton,因此在应用启动时会立即运行insert()方法。