简体   繁体   English

使用macwire注入DatabaseConfigProvider

[英]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 the slickApi.dbConfig(DbName(name)) method. 如果使用的是编译时DI,则可以使用slickApi.dbConfig(DbName(name))方法直接从SlickApi查询数据库配置。 The play.api.db.slick.SlickComponents provide access to the slickApi . 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: 再说几句话:

  • We probably should not mix @Inject with macwire because former is intended for runtime dependency injection whilst latter is for compile-time DI. 我们可能不应该将@Inject与macwire混合使用,因为前者用于运行时依赖注入,而后者则用于编译时DI。
  • The signature of 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM