如何在Play Guice模块中访问请求?

时间:2016-03-12 16:25:48

标签: playframework request guice

我正在编写一个处理多个系统的应用程序。用户可以选择他想要使用的系统,并将该系统ID存储在会话(客户端会话)

现在我有了Service类,比如CustomerService。

class CustomerService(val systemID: String) {
    // Implementation
}

我想使用Guice将Customer实例注入控制器。但是我想用ServiceID实例化CustomerService,它存储在会话中。

如何在Guice模块中访问request.session

修改

上面简化了我的代码。我的实际代码使用接口。我怎样才能使用辅助注射?

trait CustomerService(val systemID: String) {
    // Definition
}

object CustomerService{

  trait Factory {
    def apply(systemID: String) : CustomerService
  }

}

class DefaultCustomerService @Inject() (@Assisted systemID: String)
  extends CustomerService {
    // Definition
}

class CustomerController @Inject()(
                            val messagesApi: MessagesApi,
                            csFactory: CustomerService.Factory)
{
}

这给了我: CustomerService是一个接口,而不是具体的类。无法创建AssistedInject工厂。

我不想将工厂置于DefaultCustomerService下并在控制器中使用DefaultCustomerService.Factory。这是因为对于单元测试,我将使用TestCustomerService存根并希望依赖注入将TestCustomerService注入控制器而不是DefaultCustomerService

1 个答案:

答案 0 :(得分:6)

你不应该这样做。如果您需要注入需要运行时值的某个实例,则可以使用guice' AssistedInject

以下是如何在游戏中使用它:

1。使用运行时值作为参数创建服务的工厂:

object CustomerService {
  trait Factory {
    def apply(val systemID: String): CustomerService
  }
}

2。使用辅助参数

实施您的服务
class CustomerService @Inject() (@Assisted systemId: String) { .. }

3。将工厂绑定在guice模块中:

install(new FactoryModuleBuilder()
  .implement(classOf[CustomerService], classOf[CustomerServiceImpl])
  .build(classOf[CustomerService.Factory]))

4。最后将工厂注入您需要客户服务的地方:

class MyController @Inject() (csFactory: CustomerService.Factory) { .. }

这是辅助注射的另一个例子: https://www.playframework.com/documentation/2.5.x/ScalaTestingWebServiceClients