光滑的数据库配置
Slick database configuration
我的 Play 应用程序 (Play 2.4.3) 中的 Slick 配置有问题。
我阅读了 documentation article 但想将 dbConfig 从控制器移动到指定的特征并将该特征混合到存储库 class.
项目中有几个文件: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)
}
}
Guice 未能注入 BaseClientRepository 的实现,注释 @ImplementedBy 可以提供帮助。
@ImplementedBy(classOf[ClientRepository])
trait BaseClientRepository {
def getById(id: Int): Future[Client]
def getByLocation(location: String): Future[Seq[Client]]
}
dbConfig 在这种情况下应该是惰性 val 或函数。
这对我有用:
private lazy val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
我的 Play 应用程序 (Play 2.4.3) 中的 Slick 配置有问题。 我阅读了 documentation article 但想将 dbConfig 从控制器移动到指定的特征并将该特征混合到存储库 class.
项目中有几个文件: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)
}
}
Guice 未能注入 BaseClientRepository 的实现,注释 @ImplementedBy 可以提供帮助。
@ImplementedBy(classOf[ClientRepository])
trait BaseClientRepository {
def getById(id: Int): Future[Client]
def getByLocation(location: String): Future[Seq[Client]]
}
dbConfig 在这种情况下应该是惰性 val 或函数。 这对我有用:
private lazy val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)