如何在 playframework 中使用 guice 使用提供程序进行依赖注入
Posted
技术标签:
【中文标题】如何在 playframework 中使用 guice 使用提供程序进行依赖注入【英文标题】:How to use provider for dependency injection using guice in playframework 【发布时间】:2018-11-24 12:32:19 【问题描述】:我正在使用 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)
我需要在Service.scala
类中致电StatusChange.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)
【问题讨论】:
您的 ArtworkService 还需要注入 UserRepositoryTrait。 那么我如何将 UserRepostiryTrait 参数传递给 ArtworkService 类问题仍然存在(该类只会改变)我需要知道如何传递这些需要 @injected 实例的参数 根本上的问题是:创建ArtworkService
的线程的堆栈跟踪的根是什么?换句话说,是什么让该代码运行?如果这是来自某个控制器的调用链,那么您可以在此过程中拥有相关的@Inject 链(反向,即每次注入将被调用的组件)。如果代码是通过其他方式运行的,它究竟是如何运行的?
它由控制器运行,请再次查看问题,我已对其进行了编辑
@swaheed,目前还不清楚class MyController @Inject() (artworkService : ArtworkService)
的直接方法对您有什么问题
【参考方案1】:
您不需要在这里使用提供者。 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])
【讨论】:
以上是关于如何在 playframework 中使用 guice 使用提供程序进行依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
如何在 playframework 中使用 guice 使用提供程序进行依赖注入
如何在 playframework 中使用依赖注入创建 Ebeanserver?
如何使用 scala 在 playframework 2.0 中重用异常解析器