繁体   English   中英

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

[英]Scala and Slick: DatabaseConfigProvider in standalone application

我有一个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中的current方法,应将其替换为DI。

有什么方法可以在独立对象SomeParser中初始化SomeModelRepo类的对象?

最好的祝福

启动Play应用程序时,PlaySlick模块将为您处理Slick配置。 有了它,您有两种选择

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

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

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

val db = Database.forConfig("default")

Lightbend的模板上有很多示例。

编辑:对不起,我没有阅读整个问题。 您是否真的需要将其作为另一个应用程序? 您可以在应用启动时运行后台操作,例如此处 在此示例中, InitialData类被实例化为eager singleton ,因此它的insert()方法在应用程序启动时立即运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM