簡體   English   中英

使用macwire注入DatabaseConfigProvider

[英]Inject DatabaseConfigProvider with 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]

通過擴展SlickComponents可以使用play- slick通過SlickComponents實施編譯時依賴項注入

如果使用的是編譯時DI,則可以使用slickApi.dbConfig(DbName(name))方法直接從SlickApi查詢數據庫配置。 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")引用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"

修改RoomRepo以采用DatabaseConfig而不是DatabaseConfigProvider如下所示

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

和mixin這樣的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]]將不會編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM