Как выполнить инициализацию базы данных при использовании DI в Play 2.4?

Play 2.4 не рекомендует использовать GlobalSettings.onStart и Global объект целиком.

Я использую play-slick, и у него есть отличный пример внедрения зависимостей на GitHub, но отсутствует пример инициализации базы данных.

Как реализовать инициализацию базы данных при использовании DI и когда GlobalSettings.onStart недоступен?

Общие случаи инициализации базы данных: Если в режиме DEV, добавьте эти строки, если PROD сделает это. Требуются примеры.


person Ciantic    schedule 20.06.2015    source источник


Ответы (1)


Хитрость заключается в том, чтобы поместить инициализацию в конструктор внедренного класса. Вот пример:

Добавьте app/modules/Database.scala:

package modules

import com.google.inject.AbstractModule
import com.google.inject.name.Names

trait Database {
  def create(): Unit
  def drop(): Unit
}

class TestDatabase extends Database {
  initialize() // running initialization in constructor
  def initialize() = {
    println("Setup database with test data here")
  }
  def create() = ()
  def drop() = ()
}

class ProdDatabase extends Database {
  // similar to above
}

class DatabaseModule extends AbstractModule {
  def configure() = {
    bind(classOf[Database])
      .annotatedWith(Names.named("development"))
      .to(classOf[TestDatabase]).asEagerSingleton
    bind(classOf[Database])
      .annotatedWith(Names.named("production"))
      .to(classOf[TestDatabase])
  }
}

Добавьте в conf/application.conf:

play.modules.enabled += "DatabaseModule"

Это для начала. .asEagerSingleton запустит код конструктора без необходимости его внедрения. Если вы хотите выбрать, какой из них вводить, вам нужно будет удалить .asEagerSingleton и загрузить соответствующую реализацию базы данных:

  • на основе конфигурации в привязках (см. ссылку Например); или
  • в сервисе/контроллере, например:

    @Inject @Named("разработка") База данных базы данных

person bjfletcher    schedule 20.06.2015