蛋糕模式与内部实现类
//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