Zoeken…


Cakepatroon met innerlijke implementatieklasse.

//create a component that will be injected
trait TimeUtil {
    lazy val timeUtil = new TimeUtilImpl()

    class TimeUtilImpl{
        def now() = new DateTime()
    }
}

//main controller is depended on time util
trait MainController {
    _ : TimeUtil => //inject time util into main controller

    lazy val mainController = new MainControllerImpl()
    
    class MainControllerImpl {
        def printCurrentTime() = println(timeUtil.now()) //timeUtil is injected from TimeUtil trait
    }
}

object MainApp extends App {
    object app extends MainController 
       with TimeUtil //wire all components

    app.mainController.printCurrentTime()
}

In het bovenstaande voorbeeld heb ik aangetoond hoe TimeUtil in MainController moet worden geïnjecteerd.

De belangrijkste syntaxis is de _: TimeUtil => ( _: TimeUtil => ) die TimeUtil in MainController moet injecteren. Met andere woorden, MainController afhankelijk van TimeUtil .

Ik gebruik innerlijke klasse (bijv. TimeUtilImpl ) in elke component omdat, naar mijn mening, het gemakkelijker is om te testen omdat we de innerlijke klasse kunnen bespotten. En het is ook eenvoudiger om te traceren waar de methode vandaan komt wanneer het project complexer wordt.

Ten slotte bedraad ik alle componenten samen. Als u bekend bent met Guice, is dit gelijk aan Binding



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow