我正在使用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)
}
答案 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]) {}