2016-06-09 2 views
2

У меня есть приложение Play 2.5.3, которое использует Slick для чтения объекта из базы данных. Классы обслуживания строятся следующим образом:Scala и Slick: DatabaseConfigProvider в автономном приложении

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)». Кроме того, метод current в объекте Play устарел и должен быть заменен на DI.

Есть ли способ инициализировать объект класса SomeModelRepo в отдельном объекте SomeParser?

С наилучшими пожеланиями

+0

Просьба указать версию игры – cchantep

+0

Это 2.5.3. Я добавил эту информацию к вопросу. – Gandalf

ответ

0

При запуске приложения Play, модуль PlaySlick обрабатывает Пятно конфигурации для вас. С его помощью у вас есть two choices:

  1. инъецировать DatabaseConfigProvider и получить драйвер оттуда, или
  2. сделать глобальный поиск через DatabaseConfigProvider.get[JdbcProfile](Play.current), что не является предпочтительным.

В любом случае, у вас должно быть приложение для Play! Так как это не относится к вашим автономным скриптам, вы получаете сообщение об ошибке: «Нет запущенного приложения».

Таким образом, вы должны будете использовать подход Slick по умолчанию, по инстанцированию db непосредственно из конфигурации:

val db = Database.forConfig("default") 

У вас есть много о примерах на Lightbend's templates.

EDIT: Извините, я не прочитал весь вопрос. Вам действительно нужно иметь это как другое приложение? Вы можете запускать свои фоновые операции, когда ваше приложение запускается, например, here. В этом примере класс InitialData создается как eager singleton, поэтому метод insert() запускается сразу же после запуска приложения.

+0

Мне нужно сделать некоторые вставки с помощью постоянно работающих фоновых скриптов (не только во время запуска приложения), но и в то же время выполнять чтение через запущенное веб-приложение. Мне нужно немного разобраться в этом вопросе. – Gandalf