光滑的数据库配置

时间:2015-12-23 15:24:06

标签: scala playframework slick slick-3.0

我的Play应用程序(Play 2.4.3)中的Slick配置存在问题。 我读了documentation article但想要将dbConfig从控制器移到指定的trait并将这个特性混合到存储库类。

项目中有几个文件:ClientRepository(class),BaseClientRepository(trait)和BaseDbRepository(trait)。

trait BaseDbRepository {
  val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
  import dbConfig.driver.api._

  def withConnection[T](f: => DBIOAction[T, NoStream, Nothing]) = {
    dbConfig.db.run(f)
  }
}

trait BaseClientRepository {
  def getById(id: Int): Future[Client]
  def getByLocation(location: String): Future[Seq[Client]]
}

class ClientRepository extends BaseDbRepository with BaseClientRepository {

  def getById: Future[Client] = withConnection {
    ...
  }

  def getByLocation: Future[Seq[Client]] = withConnection {
    ...
  }
}

这适用于我的客户端控制器:

class Client extends Controller {
  def getById(id: Int) = ???
}

但是当我尝试将DI与Guice一起使用时:

class Client @Inject()(clientRepository: BaseClientRepository) extends Controller {
  def getById(id: Int) = Action.async {
    // I try to use client repository here
  }
}

它会因以下异常而失败 CreationException:无法创建注入器,请参阅以下错误:

1)捕获并报告了异常。消息:没有启动的应用程序   在com.google.inject.util.Modules $ OverrideModule.configure(Modules.java:177)

我尝试将此定义val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)移动到Global.scala中,它只是起作用,但我现在已经弃用了Global.scala。

那么,最适合它的地方在哪里?

更新:我使用注入模块进行DI配置:

class InjectionModule extends AbstractModule {
  def configure() {
    bind(classOf[BaseClientRepository]).toInstance(new ClientRepository)
  }
}

2 个答案:

答案 0 :(得分:1)

在这种情况下,dbConfig应该是一个惰性val或函数。 这对我有用:

private lazy val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)

答案 1 :(得分:0)

Guice无法注入BaseClientRepository的实现,注释@ImplementedBy可以提供帮助。

var $frag = $(document.createDocumentFragment());
$frag.data('foo', {'bar': 'baz'});
$('div').text($.type($frag.data('foo'))); // returns undefined.