Scala Language
Внедрение зависимости
Поиск…
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