unit-testingInyección de dependencia


Observaciones

Un enfoque que puede adoptarse para escribir software es crear dependencias a medida que se necesitan. Esta es una forma bastante intuitiva de escribir un programa y es la forma en que la mayoría de las personas tienden a aprender, en parte porque es fácil de seguir. Uno de los problemas con este enfoque es que puede ser difícil de probar. Considere un método que realice algún procesamiento basado en la fecha actual. El método podría contener algún código como el siguiente:

if (DateTime.Now.Date > processDate)
{
    // Do some processing
}

El código tiene una dependencia directa de la fecha actual. Este método puede ser difícil de probar porque la fecha actual no se puede manipular fácilmente. Un método para hacer que el código sea más verificable es eliminar la referencia directa a la fecha actual y, en cambio, proporcionar (o inyectar) la fecha actual al método que realiza el procesamiento. Esta inyección de dependencia puede hacer que sea mucho más fácil probar aspectos del código mediante el uso de pruebas dobles para simplificar el paso de configuración de la prueba de la unidad.

Sistemas IOC

Otro aspecto a considerar es la vida de las dependencias; En el caso de que la clase en sí cree sus propias dependencias (también conocidas como invariantes), entonces es responsable de eliminarlas. La inyección de dependencia invierte esto (y es por eso que a menudo nos referimos a una biblioteca de inyección como un sistema de "Inversión de Control") y significa que en lugar de que la clase sea responsable de crear, administrar y limpiar sus dependencias, un agente externo (en este caso, el sistema IoC) lo hace en su lugar.

Esto hace que sea mucho más sencillo tener dependencias que se comparten entre instancias de la misma clase; por ejemplo, considere un servicio que recupera datos de un punto final HTTP para que una clase los consuma. Dado que este servicio no tiene estado (es decir, no tiene ningún estado interno), por lo tanto, solo necesitamos una única instancia de este servicio en toda nuestra aplicación. Si bien es posible (por ejemplo, usar una clase estática) hacerlo manualmente, es mucho más simple crear la clase y decirle al sistema IoC que se creará como un Singleton , por lo que solo existe una instancia de la clase.

Otro ejemplo sería los contextos de base de datos utilizados en una aplicación web, en los que se requiere un nuevo contexto por solicitud (o hilo) y no por instancia de un controlador; esto permite que el contexto sea inyectado en cada capa ejecutada por ese hilo, sin tener que pasarlo manualmente.

Esto libera a las clases consumidoras de tener que gestionar las dependencias.

Inyección de dependencia Ejemplos relacionados