Поиск…


Cake Pattern с внутренним классом реализации.

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

В приведенном выше примере я продемонстрировал, как вводить TimeUtil в MainController.

Наиболее важным синтаксисом является самообновление ( _: TimeUtil => ), которое должно вводить TimeUtil в MainController . MainController словами, MainController зависит от TimeUtil .

Я использую внутренний класс (например, TimeUtilImpl ) в каждом компоненте, потому что, на мой взгляд, его легче тестировать, поскольку мы можем издеваться над внутренним классом. И также проще отслеживать, откуда вызывается метод, когда проект становится более сложным.

Наконец, я соединяю все компоненты вместе. Если вы знакомы с Guice, это эквивалентно Binding



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow