サーチ…


内部実装クラスを持つCakeパターン。

//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()
}

上記の例では、MainControllerにTimeUtilを注入する方法を示しました。

最も重要な構文は、 TimeUtilMainControllerに挿入するための自己注釈( _: TimeUtil =>MainController 。つまり、 MainControllerMainController依存しTimeUtil

私の考えでは、内部クラスを模擬することができるようにテストする方が簡単だから、各コンポーネントで内部クラス( TimeUtilImpl )を使用します。また、プロジェクトがより複雑になるときにメソッドが呼び出される場所をトレースすることも簡単です。

最後に、すべてのコンポーネントをまとめて配線します。あなたがGuiceに慣れているなら、これはBinding相当します



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow