2013-03-15 140 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