簡體   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