蛋糕模式與內部實現類
//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