如何在Playframework中使用guice使用提供者进行依赖项注入

时间:2018-11-24 12:32:20

标签: java scala playframework guice playframework-2.4

我正在使用playframework 2.4,这是我的代码

trait UserRepositoryTrait {
  val userRepo:UserRepository
  val sessionRepo:SessionRepository 
}

class UserRepositoryImpl extends UserRepositoryTrait {
  @Inject @Named("userRepo")val userRepo:UserRepository= null 
  @Inject @Named("sessionRepo") val sessionRepo:SessionRepository = null
  }

这是模块类

class UserDependencyModule extends AbstractModule { 

    @Override
      protected def configure() {
        bind(classOf[UserRepository]).annotatedWith(Names.named("userRepo")).toInstance(new UserRepo)
        bind(classOf[SessionRepository]).annotatedWith(Names.named("sessionRepo")).toInstance(new SessionRepo)
                bind(classOf[UserRepositoryTrait]).to(classOf[UserRepositoryImpl])
      }

}

在application.conf

play.modules.enabled += "models.guice.UserDependencyModule"

如果我将这个特征注入控制器中,但我想将此特征注入到一个类中,那么一切都很好,这里是代码

class StatusChange @Inject() (userRepository:UserRepositoryTrait) {
}

我需要在StatusChange.scala类中致电Service.scala 我该如何实例化StatusChange.scala对象

class ArtworkService() {

val status= new StatusChange(//what should i add here?)

}

我确实阅读过提供程序,但是我无法理解如何将其用于我的方案?请指导我

更新 如果我这样做是正确的吗?

class ArtworkService @inject (userRepository: UserRepositoryTrait) {

    val status= new StatusChange(userRepository)

    }

和控制器

class MyController @inject (userRepository: UserRepositoryTrait)
{
 val artworkService = new ArtworkService(userRepository)
}

1 个答案:

答案 0 :(得分:2)

您无需在此处使用提供程序。 Provider对于解决循环依赖关系引用很有用。

就您而言,您可以简单地做到:

class ArtworkService @Inject (status: StatusChange) {}

然后直接在控制器中注入ArtworkService

class MyController @Inject (artworkService: ArtworkService) {}
如果有循环参考,就会出现

Provider的图片。例如:

class ArtworkService @Inject (status: StatusChange) {}

class StatusChange @Inject (artworkService: ArtworkService) {}

在这里,我们有ArtworkService-> StatusChange && StatusChange-> ArtworkService的周期,因此,提供者可以在这些情况下进行救援。您可以通过以下方法解决此问题:

class ArtworkService @Inject (status: StatusChange) {}

class StatusChange @Inject (artworkServiceProvider: Provider[ArtworkService]) {}