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
Recursoshttps://www.manning.com/books/dependency-injection-in-dot-nethttps://app.pluralsight.com/library/courses/principles-oo-designhttp://martinfowler.com/articles/injection.htmlhttps://en.wikipedia.org/wiki/Dependency_injectionhttp://code2read.com/2015/03/07/csharp-dependency-injection-estrategias-inyectar-dependencias-di/
Preguntas