Ricerca…


Cake Pattern con classe di implementazione interna.

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

Nell'esempio sopra, ho dimostrato come iniettare TimeUtil in MainController.

La sintassi più importante è l'auto-annotazione ( _: TimeUtil => ) che consiste nell'iniettare TimeUtil in MainController . In altre parole, MainController dipende da TimeUtil .

Uso la classe interiore (ad es. TimeUtilImpl ) in ogni componente perché, a mio parere, è più facile per i test in quanto possiamo TimeUtilImpl in giro la classe interiore. Ed è anche più facile tracciare da dove viene chiamato il metodo quando il progetto diventa più complesso.

Infine, collego tutti i componenti. Se hai familiarità con Guice, questo è equivalente a Binding



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow