У меня была такая же борьба, и я придумал такое решение (используя второй подход):
Создайте контекст для использования DAO:
trait BaseContext{
def dbName: String
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](dbName)
val db = dbConfig.db
val profile = dbConfig.driver
val tables = new Tables { // this is generated by Schema Code Generator
override val profile: JdbcProfile = dbConfig.driver
}
}
@Singleton
class AppContext extends BaseContext{
def dbName = "mysql" // name in your conf right after "slick.dbs"
}
@Singleton
class TestingContext extends BaseContext{
def dbName = "h2"
}
Затем создайте модуль для привязки инъекции, и не забудьте включить его в конфиге с помощью play.modules.enabled += "your.Module"
:
class ContextModule(environment: Environment, configuration: Configuration) extends AbstractModule {
override def configure(): Unit = {
if (configuration.getString("app.mode").contains("test")) {
bind(classOf[BaseContext])
.to(classOf[TestingContext])
} else {
bind(classOf[BaseContext])
.to(classOf[AppContext])
}
}
}
И внедрите его в каждый созданный вами DAO:
class SomeDAO @Inject()(context: BaseContext){
val dbConfig = context.dbConfig
val db = context.db
val tables = context.tables
import tables.profile.api._
def otherStuff....
// you can call db.run(...), tables.WhateverYourTableIs, tables.TableRowCaseClass, ...
}
И последний шаг, ваш файл конфигурации. В моем случае я использовал app.mode
для обозначения среды, и я использую отдельные .conf
для другой среды. Конечно, в этих конфах у вас должна быть правильная конфигурация БД. Вот образец:
app.mode = "test"
# Database configuration
slick.dbs = {
# for unit test
h2 {
driver = "slick.driver.H2Driver$"
db = {
url = "jdbc:h2:mem:test;MODE=MYSQL"
driver = "org.h2.Driver"
keepAliveConnection = true
}
}
}
Я почти уверен, что мое решение не элегантное, но оно приносит пользу. :) Любое лучшее решение приветствуется!
person
noru
schedule
03.12.2015