Inyección de Dependencias: Como inyectar código sin morir de sobre dosis…

Post on 25-Jan-2017

261 views 0 download

Transcript of Inyección de Dependencias: Como inyectar código sin morir de sobre dosis…

Inyección de dependenciasComo inyectar código sin morir de sobre dosis…

Luis Alexander Aldazabal Gilhttp://code2read.com@berczeck

Temario• ¿Qué es la inyección de dependencias?• Beneficios• Tipos de dependencias• Estrategias para inyectar código• Librerías• Demo• Recursos• Preguntas

¿Qué es la inyección de dependencias?• No tiene nada

que ver con agujas

• Ni hospitales• Ni personas

enfermas• Tampoco con

una linda enfermera

¿Qué es la inyección de dependencias?• Patrón de diseño de la OOP• Fue acuñado por Martin

Fowler• Sigue el principio

Hollywood: No nos llames, nosotros te llamaremos

• Permite desarrollar código desacoplado

• Permite pasar las referencias necesarias a una clase sin necesidad que el las cree

Beneficios1. Late Binding (Enlace tardío) :

• Permite escoger que componentes se van a usar en tiempo de ejecución en lugar del tiempo de compilación sin modificar el código.

2. Extensibility (Extensibilidad) : • Permite extender y rehusar el código para agregar nuevas funcionalidades.

3. Parallel Development (Desarrollo paralelo) : • Permite que muchas personas trabajen sobre el mismo proyecto en paralelo.

4. Maintainability (Mantenimiento) : • Permite tener clases con responsabilidades claras.

5. Testeability (Testeabilidad) : • Permite tener clases que se pueden probar unitariamente.

Tipos de dependenciasNOTA: Se recomienda usar la inyección de dependencias para las dependencias volátiles.Las dependencias volátiles son las que tienden a cambiar o aún no están definidas, todo lo demás son dependencias estables.

Tipos de dependencias1. Dependencias estables:

• Tipos del framework• Clases o módulos que ya existen• Algo con muy poca probabilidad de cambio• Tipos con algoritmos deterministas, que siempre devuelven la misma

información.

2. Dependencias volátiles: • Temas de infraestructura (Base de datos, servicios web, sistema de archivos,

etc).• Dependencias que aún no existen, clases que aun falten desarrollar.• Dependencias que no están instaladas en todas las máquinas de desarrollo,

componentes de terceros.• Tipos con algoritmos no deterministas (Por ejemplo: System.Random,

System.DateTime, etc)

Estratégias• Constructor inyection – Inyección por

constructor • Property inyection – Inyección por

propiedad• Parameter inyection – Inyección por

parámetro

EstratégiasConstructor injection (Inyección por constructor)Permite escoger que componentes se van a usar en tiempo de ejecución en lugar del tiempo de compilación sin modificar el código.

EstratégiasConstructor injection (Inyección por constructor)• Pros

• Las clases auto documentan lo que necesitan para hacer su trabajo.• Se puede usar con o sin un contenedor de inversión de control.• Una vez creadas las clases estas se encuentran en un estado valido.

• Contras• El constructor puede tener muchos parámetros (Code Smell).• No trabaja bien con la Serialización se debe definir un constructor sin

parámetros.• No todos los métodos requieren los objetos que otros métodos requieren

(Baja cohesión).

EstratégiasProperty injection (Inyección por propiedad)Este tipo requiere que se cree una propiedad o un método para asignar una dependencia.

EstratégiasProperty injection (Inyección por propiedad)• Pros

• Muy flexible.• La dependencia puede cambiar en cualquier momento.

• Contras• Menos intuitivos.• Los objetos pueden encontrarse en un estado inválido desde la construcción

hasta la asignación de la dependencia.

EstratégiasParameter injection (Inyección por parámetro)Este tipo requiere que se agregue un parámetro en la firma de un método por cada dependencia que se necesite.

EstratégiasParameter injection (Inyección por parámetro)• Pros

• Más granular.• Más flexible.• No requiere cambiar el resto de la clase.

• Contras• El método puede tener muchos parámetros (Code Smell).• Cambia la firma de un método.

Librerías1. Ninject: 2. SimpleInjector: 3. StructureMap: 4. Unity: 5. Windsor: 6. Spring .Net:

LibreríasFuente:http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

Demo

Código fuente:https://github.com/Code2Read/SoftwareDesign/tree/master/AplicandoIoC/ServicioAplicacion

Preguntas