我正在编写一个处理多个系统的应用程序。用户可以选择他想要使用的系统,并将该系统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
。
答案 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