【问题标题】:Scala and Slick: DatabaseConfigProvider in standalone applicationScala 和 Slick:独立应用程序中的 DatabaseConfigProvider
【发布时间】:2016-10-09 22:53:40
【问题描述】:

我有一个 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 脚本来在后台执行一些操作。我需要连接到其中的数据库,并且我想重用我现有的服务类来从数据库中读取对象。

要实例化 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 类对象?

最好的问候

【问题讨论】:

  • 请注明Play版本
  • 是2.5.3。我将此信息添加到问题中。

标签: scala slick playframework-2.5


【解决方案1】:

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

  1. 注入DatabaseConfigProvider 并从那里获取驱动程序,或者
  2. 通过DatabaseConfigProvider.get[JdbcProfile](Play.current) 进行全局查找,这不是首选。

无论哪种方式,您都必须运行您的 Play 应用!由于您的独立脚本不是这种情况,因此您会收到错误消息:“没有启动的应用程序”。

因此,您将不得不使用 Slick 的默认方法,直接从 config 实例化 db:

val db = Database.forConfig("default")

Lightbend's templates 有很多例子。

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

【讨论】:

  • 我需要通过不断运行的后台脚本(不仅在应用程序启动期间)进行一些插入,同时通过运行 Web 应用程序执行读取。我需要稍微挖掘一下这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2012-11-03
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多