[英]DI or Service Locator : Injecting implementations at run-time ( no static binding ) in scala
[英]Scala service separating by environment (service locator?)
我的Scala应用程序支持2种环境:TEST和PROD。 区别在于使用服务。 例如,生产Emailer实际上会发送一封电子邮件,而测试Emailer则是存根或模拟。 环境由参数配置。 如何实现按环境隔离的服务? 您喜欢像Guice这样的DI解决方案吗?
除了Guice,如果需要,您可以继续使用本机Scala蛋糕模式依赖项注入。
// MyService.scala
trait MyService {
this: Emailer => // Cake pattern: this must be instatiated with an Emailer trait
def doSomething() {
//...
this.email(...)
//...
}
}
// Somewhere else
trait Emailer { def email(args: String): Unit }
trait MockEmailer { override def email(args: String) = println("Email was sent!") }
trait RealEmailer { override def email(args: String) = actuallySendAnEmail(args) }
// Application.scala
sealed trait Environment
case object Test extends Environment
case object Prod extends Environment
object Application {
private var _environment: Environment = Test // Choose default
def environment = _environment
def main(args: Array[String) {
// Determine environment at startup
if(args.contains("PROD") {
_environment = Prod
} else {
_environment = Test
}
// ...
}
}
// Configuration.scala
val myService = Application.environment match {
case Test => new MyService with MockEmailer
case Prod => new MyService with RealEmailer
}
自己编写需要花费几行,但是不需要任何单独的依赖注入框架及其自身的注释详细程度。 此外,您将不会遇到运行时依赖项注入错误-Scala编译器保证此方法将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.