在对象内部注入依赖项

时间:2013-03-15 09:46:05

标签: scala dependency-injection playframework-2.0

我是Play框架和scala的新手,我正在尝试在随播对象中注入依赖项。

我有一个简单的案例类,如:

case class Bar(foo: Int) {}

使用如下的伴侣对象:

object Bar {
  val myDependency =
  if (isTest) {
    // Mock
  }
  else
  {
    // Actual implementation
  }

  val form = Form(mapping(
    "foo" -> number(0, 100).verifying(foo => myDependency.validate(foo)), 
  )(Bar.apply)(Bar.unapply))
}

这很好用,但这并不是一个干净的方法。我希望能够在构建时注入依赖项,以便在测试时注入不同的模拟对象,并在开发和生产中注入不同的实际实现。

实现这一目标的最佳方式是什么?

任何帮助真的很感激。谢谢!

1 个答案:

答案 0 :(得分:0)

按照 Cake 的说法,我们可以尝试将您的示例更改为

trait Validator {
    def validate(foo: Int): Boolean
}

trait TestValidation {
    val validator = new Validator {
        def validate(foo: Int): Boolean = ...   
    }
}

trait ImplValidation {
    val validator = new Validator {
        def validate(foo: Int): Boolean = ...   
    }
}


trait BarBehavior {
    def validator: Validator

    val form = Form(mapping(...))(Bar.apply)(Bar.unapply)
}

//use this in your tests
object TestBar extends BarBehavior with TestValidation

//use this in production
object ImplBar extends BarBehavior with ImplValidation

您还应该尝试测试此示例是否也适合Play框架