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.

Referencias