在 Play 2.4 中使用 DI 时如何进行数据库初始化?

Posted

技术标签:

【中文标题】在 Play 2.4 中使用 DI 时如何进行数据库初始化?【英文标题】:How to do database initialization when using DI in Play 2.4? 【发布时间】:2015-06-20 11:35:44 【问题描述】:

Play 2.4 不鼓励使用GlobalSettings.onStart and whole Global object。

我正在使用 play-slick,它有 great DI sample in GitHub,但它缺少一个如何进行数据库初始化的示例。

在使用 DI 和 GlobalSettings.onStart 不可用时如何实现数据库初始化?

数据库初始化的常见情况是:如果在 DEV 模式下,添加这些行,如果 PROD 执行这些。想要的例子。

【问题讨论】:

【参考方案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 并加载适当的数据库实现:

基于configuration in the bindings(参见链接示例);或

在服务/控制器中,例如:

@Inject @Named("development") 数据库数据库

【讨论】:

以上是关于在 Play 2.4 中使用 DI 时如何进行数据库初始化?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 play 2.4 中使用 CommonsMailerPlugin

如何使用Slick和Play在测试中应用手动演变! 2.4

在 Play 框架中注入 MongoDB 实例 [java]

Play 2.4 JPA/Hibernate EntityManager 不刷新到数据库

Play Framework 2.4 在 Scala 模板中使用注入变量

如何将 CDN 与 Play Framework 2.4 资产一起使用?