簡體   English   中英

使用Play2.4和scala的Google Guice的循環依賴性錯誤

[英]Circular Dependency Error for Google Guice with Play2.4 and scala

我的應用程序使用Play 2.4和Scala 2.11 。我開始轉換現有代碼以使用Play 2.4附帶的Google Guice

當我在進行第一組更改后運行代碼時,我發現代碼中的某些DAO失敗並出現循環依賴性錯誤。

例如,我有兩個DAO

class BookDAO @Inject()
(protected val personDAO : PersonDAO,
 @NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
...
...
val personId = //some id
personDAO.get(personId)
}

class PersonDAO @Inject()
(protected val bookDAO : BookDAO,
 @NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
...
...
val bookName= //some id
personDAO.getByName(bookName)
}

嘗試訪問BookDAO或PersonDAO時出現以下錯誤

Tried proxying schema.BookDAO to support a circular dependency, but it is not an interface.
  at schema.BookDAO.class(Books.scala:52)
  while locating schema.BookDAO

有人可以幫我解決這個錯誤。

提前致謝

快速解決方案

注入Provider

class BookDAO @Inject()(personDaoProvider: Provider[PersonDAO], ...)
extends HasDatabaseConfigProvider[JdbcProfile] {
  val personDAO = personDaoProvider.get
  def person = personDAO.get(personId)
}

BookDAO 這將開箱即用。 Guice已經“知道”如何注入提供商。


更好的方法

將類定義與實現分離。 見Mon Calamari的回答。

按如下方式定義依賴項,並將所有需要的方法從類轉移到trait:

@ImplementedBy(classOf[BookDao])
trait IBookDao {
  // abstract defs
}

class BookDao @Inject()(protected val personDAO: IPersonDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IBookDao {
}

@ImplementedBy(classOf[PersonDao])
trait IPersonDao {
  // abstract defs
}

class PersonDao @Inject()(protected val bookDAO: IBookDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IPersonDao {
}

如您所見,每個dao實現了一個特征,並且所有dao依賴項都由trait注入。 這使Guice可能注入代理類並解決循環依賴問題。

有關詳細信息playframework scala依賴注入這里

暫無
暫無

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

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