2013-03-15 21 views
5

Sono nuovo per Play framework e scala e sto cercando di iniettare una dipendenza all'interno di un oggetto associato.Iniettare una dipendenza all'interno di un oggetto

Ho una semplice classe caso, come:

case class Bar(foo: Int) {} 

Con un oggetto associato come:

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

Questo funziona bene, ma non è davvero un modo pulito per farlo. Mi piacerebbe essere in grado di iniettare la dipendenza al momento della compilazione in modo da poter iniettare oggetti mock diversi durante il test e diverse implementazioni reali nello sviluppo e nella produzione.

Qual è il modo migliore per raggiungere questo obiettivo?

Qualsiasi aiuto davvero apprezzato. Grazie!

+0

penso quello di cui hai bisogno è un cosiddetto "modello di torta". C'era un post sul blog di Daniel Spiewak, ma non riesco a trovarlo. Ma questo (http://www.warski.org/blog/2011/04/di-in-scala-cake-pattern-pros-cons/) dovrebbe essere un buon riferimento. – MisterMetaphor

+1

Questo è il [post originale] (http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/) di Jonas Boner –

risposta

0

Lungo le linee del torta, possiamo provare a cambiare il vostro esempio per

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 

Si dovrebbe inoltre provare e testare se questo esempio si inserisce bene all'interno del quadro Play, anche

+0

Grazie, @ pagoda_5b. Ricevo un errore nella barra degli oggetti "Solo le classi possono avere membri dichiarati ma non definiti" – satoshi

+0

Anche "Parametri del valore non specificato: pippo: Int" dove scrivo 'oggetto ImplBar estende Bar con ImplValidation' (dove' foo: Int' è il solo attributo di Bar) – satoshi

+0

Ho aggiornato il codice per utilizzare correttamente un tratto per il comportamento della barra di base, ma suppongo che questo non si adatti bene alla necessità di definire un oggetto associato su Bar ... Elaborerò più –

Problemi correlati