2013-03-15 9 views
5

Ich bin neu im Play Framework und Scala und ich versuche, eine Abhängigkeit in einem Companion-Objekt zu injizieren.Injizieren Sie eine Abhängigkeit in einem Objekt

Ich habe eine einfache Fallklasse, wie:

case class Bar(foo: Int) {} 

Mit einem Begleiter Objekt wie:

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)) 
} 

Dies funktioniert gut, aber es ist nicht wirklich eine saubere Art und Weise, es zu tun. Ich würde gerne in der Lage sein, die Abhängigkeit zur Build-Zeit zu injizieren, so dass ich verschiedene Mock-Objekte beim Testen und verschiedene reale Implementierungen in Entwicklung und Produktion injizieren kann.

Was ist der beste Weg, dies zu erreichen?

Jede Hilfe wirklich geschätzt. Vielen Dank!

+0

Ich denke, Was Sie brauchen, ist ein sogenanntes "Kuchenmuster". Es gab einen Blogbeitrag von Daniel Spiewak, aber ich kann es nicht finden. Aber das (http://www.warski.org/blog/2011/04/diin-scala-cake-pattern-pros-cons/) sollte als Referenz dienen. – MisterMetaphor

+1

Dies ist der [ursprüngliche Beitrag] (http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/) von Jonas Boner –

Antwort

0

Nach dem Vorbild des Kuchens, können wir versuchen, Ihr Beispiel zu

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 

Sie sollten zusätzlich Test versuchen und zu ändern, wenn dieses Beispiel paßt gut in dem Play-Framework zu

+0

Danke, @ Pagoda_5b. Ich erhalte einen Fehler in der Objektleiste "Nur Klassen können deklarierte, aber undefinierte Mitglieder haben" – satoshi

+0

Auch "Nicht spezifizierte Werte Parameter: foo: Int" wo ich schreibe 'Objekt ImplBar erweitert Bar mit ImplValidation' (wobei' foo: Int' das ist einziges Attribut von Bar) – satoshi

+0

Ich habe den Code aktualisiert, um ein Merkmal für das Basis-Bar-Verhalten korrekt zu verwenden, aber ich denke, das passt nicht gut zu Ihrem Bedürfnis, ein Begleitobjekt zu Bar zu definieren ... Ich werde mehr ausführen –

Verwandte Themen