2013-03-15 90 views
5

我是新来的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)) 
} 

这工作得很好,但它不是一个真正的干净的方式来做到这一点。我希望能够在构建时注入依赖,以便在开发和生产中测试和实现不同的实现时注入不同的模拟对象。

达到此目的的最佳方法是什么?

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

+0

我想你需要的是一个所谓的“蛋糕模式”。 Daniel Spiewak发表了一篇博客文章,但似乎无法找到它。但是这(http://www.warski.org/blog/2011/04/di-in-scala-cake-pattern-pros-cons/)应该是一个很好的参考。 – MisterMetaphor 2013-03-15 09:53:00

+1

这是来自Jonas Boner的[原文](http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/) – 2013-03-15 10:52:56

回答

0

沿着蛋糕的线,我们可以尝试你的榜样改变

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 

,你应该额外尝试和测试,如果这个例子中,播放框架内的配合也很好

+0

谢谢,@ pagoda_5b。我在对象栏中出现错误“只有类可以声明但未定义的成员” – satoshi 2013-03-18 09:23:22

+0

还有“未指定的值参数:foo:Int”,其中我写了 “对象ImplBar使用ImplValidation扩展Bar”(其中'foo:Int'是只有酒吧的属性) – satoshi 2013-03-18 09:28:36

+0

我更新了代码,以正确使用基本酒吧行为的特质,但我想这不符合您需要定义酒吧的伴侣对象...我会详细说明更多 – 2013-03-18 10:48:45