繁体   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