2013-03-15 18 views
5

Jestem nowy w strukturze Play i scala i próbuję wprowadzić zależność wewnątrz obiektu towarzyszącego.Wstrzyknięcie zależności wewnątrz obiektu

Mam proste klasy sprawy, jak:

case class Bar(foo: Int) {} 

Z obiektu towarzyszącego jak:

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

Działa to dobrze, ale to naprawdę nie jest czysty sposób to zrobić. Chciałbym móc wstrzyknąć zależność w czasie kompilacji, aby móc wstrzykiwać różne symulowane obiekty podczas testowania i różnych rzeczywistych implementacji w fazie projektowania i produkcji.

Jaki jest najlepszy sposób, aby to osiągnąć?

Każda pomoc naprawdę doceniona. Dzięki!

+0

myślę to, czego potrzebujesz, to tak zwany "wzór tortu". Był blog napisany przez Daniela Śpiewaka, ale nie mogę tego znaleźć. Ale ten (http://www.warski.org/blog/2011/04/di-in-scala-cake-pattern-pros-cons/) powinien być dobry jako punkt odniesienia. – MisterMetaphor

+1

To jest [oryginalna wiadomość] (http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/) od Jonas Boner –

Odpowiedz

0

Wzorując się na Ciasto, możemy spróbować zmienić swój przykład do

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 

Należy dodatkowo spróbować i przetestować, czy ten przykład dobrze wpisuje się w ramy Play, zbyt

+0

Dzięki, @ pagoda_5b. Pojawił się błąd w pasku obiektu "Tylko klasy mogły zadeklarować ale niezdefiniowani członkowie" – satoshi

+0

Również "Nieokreślone parametry wartości: foo: Int" gdzie piszę 'obiekt ImplBar rozszerza pasek z ImplValidation' (gdzie' foo: Int' jest tylko atrybut paska) – satoshi

+0

Zaktualizowałem kod, aby poprawnie użyć cechy dla podstawowego zachowania paska, ale myślę, że to nie pasuje do twojej potrzeby zdefiniowania obiektu towarzyszącego na Bar ... Rozwiążę więcej –

Powiązane problemy