0

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

创建RoomRepo

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

注入它

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

使用macwire加载的ChatEngine

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 = 线[DatabaseConfigProvider.get[JdbcProfile]]

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

[错误] 懒惰 val dbRoom = 线 [RoomRepo]

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

[错误] 懒 val chatEngine = 线 [ChatEngine]

4

1 回答 1

1

play- slick可用于通过 MacWire 通过扩展实现编译时依赖注入SlickComponents

如果您使用的是编译时 DI,则可以直接从SlickApiusingslickApi.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]
}

NoteDbName("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。
  • 的签名wiredef wire[T]: TwhereT必须是在编译时解析的类型,同时DatabaseConfigProvider.get[JdbcProfile]是运行时值,因此wire[DatabaseConfigProvider.get[JdbcProfile]]不会编译。
于 2019-07-13T20:12:46.557 回答