Play 2.4使用DI时如何初始化数据库?
How to do database initialization when using DI in Play 2.4?
Play 2.4 不鼓励使用 GlobalSettings.onStart
and whole Global
object。
我正在使用 play-slick,它有 great DI sample in GitHub,但缺少如何进行数据库初始化的示例。
如何在使用 DI 和 GlobalSettings.onStart 不可用时实现数据库初始化?
数据库初始化的常见情况是:如果在 DEV 模式下,添加这些行,如果 PROD 模式下添加这些行。需要示例。
诀窍是将初始化放在注入的 class 的 构造函数 中。这是一个例子:
添加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
并加载适当的数据库实现:
- 基于configuration in the bindings(例如参见link);或
中的service/controller,例如:
@Inject @Named("development") 数据库数据库
Play 2.4 不鼓励使用 GlobalSettings.onStart
and whole Global
object。
我正在使用 play-slick,它有 great DI sample in GitHub,但缺少如何进行数据库初始化的示例。
如何在使用 DI 和 GlobalSettings.onStart 不可用时实现数据库初始化?
数据库初始化的常见情况是:如果在 DEV 模式下,添加这些行,如果 PROD 模式下添加这些行。需要示例。
诀窍是将初始化放在注入的 class 的 构造函数 中。这是一个例子:
添加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
并加载适当的数据库实现:
- 基于configuration in the bindings(例如参见link);或
中的service/controller,例如:
@Inject @Named("development") 数据库数据库