[英]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.