Scala Language
Inyección de dependencia
Buscar..
Patrón de pastel con clase de implementación interna.
//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()
}
En el ejemplo anterior, demostré cómo inyectar TimeUtil en MainController.
La sintaxis más importante es la auto-anotación ( _: TimeUtil =>
) que consiste en inyectar TimeUtil
en MainController
. En otra palabra, MainController
depende de TimeUtil
.
Utilizo la clase interna (por ejemplo, TimeUtilImpl
) en cada componente porque, en mi opinión, es más fácil de probar ya que podemos burlarnos de la clase interna. Y también es más fácil para rastrear desde donde se llama el método cuando el proyecto se vuelve más complejo.
Por último, conecto todos los componentes juntos. Si está familiarizado con Guice, esto es equivalente a Binding
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow