首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >玩scala -通过Guice喷射器实例注入依赖项

玩scala -通过Guice喷射器实例注入依赖项
EN

Stack Overflow用户
提问于 2015-09-10 11:09:32
回答 1查看 2.8K关注 0票数 2

我的应用程序使用了内置的DI支持的Play-2.4.2/Scala-2.11.6

我的所有DAO都将实现绑定到接口,如下所示,这是Guice中最简单的方法

代码语言:javascript
复制
@ImplementedBy(classOf[PersonDAOImpl])
trait PersonDAO {
}

class PersonDAOImpl @Inject()
(
(@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider,
 protected val cache : CacheApi) extends PersonDAO with SQLWrapper {
..
...

}

上述实现不需要添加任何模块来提供绑定。

现在,出于某种原因,我不希望使用@Inject注释将依赖项注入到Books类的构造函数中。所以,我试着按以下方式注射

代码语言:javascript
复制
class Books {

  val injector = Guice.createInjector()

  val personDAO : PersonDAO = injector.getInstance(classOf[PersonDAOImpl])

..
...

}

但是,这给我抛出了guice配置异常,它说:

代码语言:javascript
复制
Caused by: com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for play.api.cache.CacheApi was bound.
  while locating play.api.cache.CacheApi
    for parameter 1 at schema.PersonDAOImpl.<init>
  while locating PersonDAO

2)  No implementation for play.api.db.slick.DatabaseConfigProvider annotated with @play.db.NamedDatabase(value=mysql) was bound.
  while locating play.api.cache.CacheApi
    for parameter 2 at schema.PersonDAOImpl.<init>  while locating PersonDAO

现在需要做些什么?在这种情况下,我的做法是对还是错?有人能帮我解决这个问题吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-10 16:27:41

您可以使用当前播放的喷射器 应用程序

代码语言:javascript
复制
import play.api.{ Application, Play }
import play.api.inject.Injector

val currentApp: Application = Play.current
val injector: Injector = currentApp.injector
// in short play.api.Play.current.injector

// Then use the injector
import play.api.inject.ApplicationLifecycle
current.injector.instanceOf[ApplicationLifecycle].
  addStopHook { () => ??? }

(参见将injector为ReactiveMongo播放插件结合使用的示例)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32500254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档