Recherche…


Modèle de gâteau avec la classe d'implémentation interne.

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

Dans l'exemple ci-dessus, j'ai montré comment injecter TimeUtil dans MainController.

La syntaxe la plus importante est l'auto-annotation ( _: TimeUtil => ) qui consiste à injecter TimeUtil dans MainController . En d'autres termes, MainController dépend de TimeUtil .

J'utilise la classe interne (par exemple TimeUtilImpl ) dans chaque composant car, à mon avis, il est plus facile de tester car nous pouvons nous moquer de la classe interne. Et il est également plus facile de suivre où la méthode est appelée lorsque le projet devient plus complexe.

Enfin, je connecte tous les composants ensemble. Si vous connaissez Guice, cela équivaut à Binding



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow