[英]Inject DatabaseConfigProvider with macwire
I have tried to add Slick to my project 我试图将Slick添加到我的项目中
Create RoomRepo class 创建RoomRepo类
class RoomRepo @Inject() (dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) extends HasDatabaseConfigProvider[JdbcProfile]{/**...*/}
Inject it 注入它
class ChatEngine @Inject()(dbRoom: RoomRepo)(socketIO: SocketIO)(implicit mat: Materializer){/**...*/}
ChatEngine loaded with macwire 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
}
And then I get this error: 然后我得到这个错误:
[error] /MyApplicationLoader.scala:31:59: type get is not a member of object play.api.db.slick.DatabaseConfigProvider
[错误] /MyApplicationLoader.scala:31:59:类型get不是对象play.api.db.slick.DatabaseConfigProvider的成员
[error] lazy val dbConfigProvider = wire[DatabaseConfigProvider.get[JdbcProfile]]
[错误]延迟val dbConfigProvider = wire [DatabaseConfigProvider.get [JdbcProfile]]
[error] ^ [error] /MyApplicationLoader.scala:32:25: Cannot find a value of type: [play.api.db.slick.DatabaseConfigProvider]
[错误] ^ [错误] /MyApplicationLoader.scala:32:25:找不到以下类型的值:[play.api.db.slick.DatabaseConfigProvider]
[error] lazy val dbRoom = wire[RoomRepo]
[错误]懒val dbRoom =电线[RoomRepo]
[error] ^ [error] /MyApplicationLoader.scala:33:29: Cannot find a value of type: [models.RoomRepo]
[错误] ^ [错误] /MyApplicationLoader.scala:33:29:找不到类型的值:[models.RoomRepo]
[error] lazy val chatEngine = wire[ChatEngine]
[错误]懒惰的val chatEngine =电线[ChatEngine]
play-slick can be used to implement compile-time dependency injection via MacWire by extending SlickComponents
通过扩展
SlickComponents
可以使用play- slick通过SlickComponents
实施编译时依赖项注入
If you're using compile-time DI, you can query the database config directly from the
SlickApi
using theslickApi.dbConfig(DbName(name))
method.如果使用的是编译时DI,则可以使用
slickApi.dbConfig(DbName(name))
方法直接从SlickApi
查询数据库配置。 Theplay.api.db.slick.SlickComponents
provide access to theslickApi
.play.api.db.slick.SlickComponents
提供对slickApi
访问。
like so 像这样
trait DatabaseComponents extends SlickComponents {
implicit def ec: ExecutionContext
lazy val dbConfig = slickApi.dbConfig[JdbcProfile](DbName("default"))
lazy val roomRepo: RoomRepo = wire[RoomRepo]
}
Note DbName("default")
refers to default
database from application.conf
, for example 注意
DbName("default")
引用application.conf
default
数据库,例如
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"
Modify RoomRepo
to take DatabaseConfig
instead of DatabaseConfigProvider
like so 修改
RoomRepo
以采用DatabaseConfig
而不是DatabaseConfigProvider
如下所示
class RoomRepo(dbConfig: DatabaseConfig[JdbcProfile]))(implicit ec: ExecutionContext) ...
and mixin DatabaseComponents
like so 和mixin这样的
DatabaseComponents
trait MyApplication
extends BuiltInComponents
with AssetsComponents
with SocketIOComponents
with DatabaseComponents {
...
implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global
}
Couple of more remarks: 再说几句话:
@Inject
with macwire because former is intended for runtime dependency injection whilst latter is for compile-time DI. @Inject
与macwire混合使用,因为前者用于运行时依赖注入,而后者则用于编译时DI。 wire
is def wire[T]: T
where T
has to be a type resolved at compile time whilst DatabaseConfigProvider.get[JdbcProfile]
is a runtime value, therefore wire[DatabaseConfigProvider.get[JdbcProfile]]
will not compile. wire
的签名是def wire[T]: T
,其中T
必须是在编译时解析的类型,而DatabaseConfigProvider.get[JdbcProfile]
是运行时值,因此, wire[DatabaseConfigProvider.get[JdbcProfile]]
将不会编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.