蛋糕模式與內部實現類

//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 取決於 TimeUtil

我在每個元件中使用內部類(例如 TimeUtilImpl),因為在我看來,測試更容易,因為我們可以模擬內部類。當專案變得更加複雜時,跟蹤呼叫方法的位置也更容易。

最後,我將所有元件連線在一起。如果你熟悉 Guice,這相當於 Binding