2013-03-15 13 views
5

私はPlayフレームワークとスカラの新機能です。コンパニオンオブジェクト内に依存関係を挿入しようとしています。以下のようなコンパニオンオブジェクトでオブジェクト内に依存関係を挿入する

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

私が思うに、この例では、プレイの枠組みの範囲内に十分収まる場合は、追加しようとすると、テストする必要があり

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 

にあなたの例を変更しようとすることができますあなたが必要とするものは、いわゆる "ケーキパターン"です。 Daniel Spiewakのブログ記事がありましたが、見つけられないようです。しかし、これは参考にしてください(http://www.warski.org/blog/2011/04/di-in-scala-cake-pattern-pros-cons/)。 – MisterMetaphor

+1

これはJonas Bonerの[オリジナル投稿](http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/) –

答えて

0

、我々はあまりにも

+0

ありがとう、@ pagoda_5bです。オブジェクトにエラーが発生するBar "宣言されているが未定義のメンバーしか宣言できません" – satoshi

+0

また、 "指定されていない値パラメータ:foo:Int"ここでは オブジェクトImplBar ImplBid extends BarをImplBar extends(ここで 'foo:Int'はBarのアトリビュートのみ) – satoshi

+0

ベースバーのビヘイビアの特性を正しく使用するようにコードを更新しましたが、これはBarのコンパニオンオブジェクトを定義する必要がないと思います...もっと詳しく説明します –

関連する問題