使用macwire注入DatabaseConfigProvider

时间:2019-07-12 08:58:42

标签: scala playframework slick macwire

我试图将 Slick 添加到我的项目中

创建 RoomRepo

class RoomRepo @Inject() (dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) extends HasDatabaseConfigProvider[JdbcProfile]{/**...*/}

注入

class ChatEngine @Inject()(dbRoom: RoomRepo)(socketIO: SocketIO)(implicit mat: Materializer){/**...*/}

ChatEngine 已加载 macwire

trait MyApplication extends BuiltInComponents
  with AssetsComponents
  with SocketIOComponents {
  lazy val dbConfigProvider = wire[DatabaseConfigProvider.get[JdbcProfile]]
  lazy val dbRoom = wire[RoomRepo]
  lazy val chatEngine = wire[ChatEngine]
  lazy val engineIOController: EngineIOController = chatEngine.controller

  override lazy val router = {
    val prefix = "/"
    wire[_root_.router.Routes]
  }
  override lazy val httpFilters = Nil
}

然后我得到这个错误:

  

[错误] /MyApplicationLoader.scala:31:59:类型get不是以下成员   对象play.api.db.slick.DatabaseConfigProvider

     

[错误]惰性val dbConfigProvider =   wire [DatabaseConfigProvider.get [JdbcProfile]]

     

[错误] ^   [错误] /MyApplicationLoader.scala:32:25:找不到类型的值:   [play.api.db.slick.DatabaseConfigProvider]

     

[错误]惰性val dbRoom =电线[RoomRepo]

     

[错误] ^ [错误]   /MyApplicationLoader.scala:33:29:找不到类型的值:   [models.RoomRepo]

     

[错误]懒惰的val chatEngine =电线[ChatEngine]

1 个答案:

答案 0 :(得分:0)

play-slick可用于通过扩展SlickComponents

通过MacWire实现compile-time dependency injection
  

如果您使用的是编译时DI,则可以使用SlickApi方法直接从slickApi.dbConfig(DbName(name))查询数据库配置。 play.api.db.slick.SlickComponents提供对slickApi的访问权限。

像这样

trait DatabaseComponents extends SlickComponents {
  implicit def ec: ExecutionContext
  lazy val dbConfig = slickApi.dbConfig[JdbcProfile](DbName("default"))
  lazy val roomRepo: RoomRepo = wire[RoomRepo]
}

例如,DbName("default")是指default中的application.conf数据库

slick.dbs.default.profile="slick.jdbc.H2Profile$"
slick.dbs.default.db.profile="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play;DB_CLOSE_DELAY=-1"

修改RoomRepo以采用DatabaseConfig而不是DatabaseConfigProvider

class RoomRepo(dbConfig: DatabaseConfig[JdbcProfile]))(implicit ec: ExecutionContext) ...

像这样混入DatabaseComponents

trait MyApplication 
  extends BuiltInComponents
  with AssetsComponents
  with SocketIOComponents
  with DatabaseComponents {

  ...
  implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global
}

更多评论:

  • 我们可能不应该将@Inject与macwire混合使用,因为前者用于运行时依赖注入,而后者则用于编译时DI。
  • wire的签名为def wire[T]: T,其中T必须是在编译时解析的类型,而DatabaseConfigProvider.get[JdbcProfile]是运行时值,因此wire[DatabaseConfigProvider.get[JdbcProfile]]将无法编译。
相关问题