Notas sobre inyección de dependencias
Inyección de dependencias
Con este enfoque, se toman las dependencias de una clase y se proporcionan en lugar de que la instancia de la clase las obtenga por sí misma. La implementación de la inyección de dependencia proporciona las siguientes ventajas:
Reutilización de código.
Facilidad para la refactorización de código.
Facilidad para realización de pruebas.
Martin Fowler se refiere a tres estilos principales de inyección de dependencias:
Inyección de constructor.
Inyección por propiedad (setter injection).
Inyección por interfaz.
Formas de aplicar inyección de dependencias en las aplicaciones:
Manual.
Automatizada.
Sin inyección de dependencias
class LoginActivity: Activity() {
private lateinit var loginViewModel: LoginViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val retrofit = Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(LoginService::class.java)
val remoteDataSource = UserRemoteDataSource(retrofit)
val localDataSource = UserLocalDataSource()
val userRepository = UserRepository(localDataSource, remoteDataSource)
loginViewModel = LoginViewModel(userRepository)
}
}
Inyección manual de dependencias
class MyApplication : Application() {
val appContainer = AppContainer()
}
class LoginActivity: Activity() {
private lateinit var loginViewModel: LoginViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val appContainer = (application as MyApplication).appContainer
loginViewModel = LoginViewModel(appContainer.userRepository)
}
}
Aplicación
Clase base para mantener el estado de la aplicación global. La clase Aplicación, o su subclase de la clase Aplicación, se instancia antes que cualquier otra clase cuando se crea el proceso para su aplicación/paquete.
Desafío
- Implementa inyección manual de dependencias en tu proyecto.