如何在 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?

如何在 playframework 中应用全局过滤器

如何使用 scala 在 playframework 2.0 中重用异常解析器

如何在 playframework 2.0 中配置 FS 数据库?

如何跟踪 Playframework 调用的所有 HTTP 请求?