蛋糕模式与内部实现类

//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