【问题标题】:Is it possible to use scala self types with guice?是否可以使用带有 guice 的 scala self 类型?
【发布时间】:2017-09-15 15:49:04
【问题描述】:

我有一个控制器:

class HomeController @Inject() (cc: ControllerComponents) extends AbstractController(cc)with Logging 
{
  this: SecuredActionByToken =>

  def index = CheckedToken{ ...

SecuredActionByToken trait 使用类名CheckTokenService 来验证用户是否可以运行“索引”(我们正在尝试从一种蛋糕模式转移到 Guice)。 p>

是否可以将CheckTokenService 注入SecuredActionByToken?当然,我可以将它注入HomeController 本身并以某种方式使用它,但我真的不想在控制器不直接使用它们时将它们推送到它们。

【问题讨论】:

  • 您可以在使用 Guice 时混合使用构造函数注入和方法注入,尽管如果您正在创建模拟或手动创建控制器实例,这会使编写测试变得更加困难。所以你的SecuredActionByToken 需要有一个@Inject def setCheckTokenService(cts: CheckTokenService),它将在实例化控制器后被调用。查看示例here

标签: scala playframework guice self-type


【解决方案1】:

我最终为这个 bean 创建了自己的提供程序,这样我可以直接向提供程序注入服务并在覆盖特征方法中使用它:

class HomeControllerFactory @Inject()
  (controllerComponents: ControllerComponents, cts: CheckTokenService, dbConfigProvider: DatabaseConfigProvider)
  extends Provider[HomeController]{
  override def get(): HomeController = {
    new HomeController(controllerComponents) with SecuredActionByToken {
      override def checkTokenService: CheckTokenService = cts
    }
  }
}

加绑定:

bind(classOf[HomeController]).toProvider(classOf[HomeControllerFactory])

我也可以通过这样创建 homeController 来测试:

val testCheckTokenService =...
val homeController = new HomeController(stubControllerComponents()) with SecuredActionByToken {
override def checkTokenService: CheckTokenService = testCheckTokenService....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2015-09-15
    • 2013-02-24
    • 2012-05-04
    相关资源
    最近更新 更多