我试图将 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]
答案 0 :(得分:0)
play-slick可用于通过扩展SlickComponents
如果您使用的是编译时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]]
将无法编译。