Inyección de dependencias en Node.js con InversifyJS & TypeScript

RemoJansen 2,845 views 31 slides Jun 01, 2017
Slide 1
Slide 1 of 31
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31

About This Presentation

Inyección de dependencias en Node.js con InversifyJS & TypeScript


Slide Content

Inyección de dependencias en Node.js con InversifyJS & TypeScript Presentado por Remo H. Jansen

Líder técnico del equipo de desarrollo web en Stellwagen Technology Remo H. Jansen Microsoft MVP , escritor, ponente amante de la tecnología & entusiasta del movimiento Open Source Autor de @InversifyJS & Learning TypeScript Organizador de @DubTypeScript & @DublinOSSMeetup Sígueme en www.remojansen.com , @remohjansen & github.com/remojansen

Puesta en marcha en 2016 Stellwagen Technology Desarrolla tecnologías para modelar y analizar aviones y vehículos de inversión asociados. www.stelltec.com

Un superconjunto tipado de JavaScript que nos ayuda a desarrollar aplicaciones JavaScript a gran escala. TypeScript

¿Qué es TypeScript? Es un superconjunto tipado de JavaScript. Ofrece seguridad y protección de tipos . Compila a JavaScript facil de leer. Funciona en cualquier IDE, browser, host, SO. Es un proyecto open source . Esta basado en estándares abiertos (ES6, ES7...).

TypeScript es el JavaScript de mañana + tipos! “ Estamos muy contentos de anunciar que hemos unido los lenguajes TypeScript y AtScript, y que Angular 2, la próxima versión de la popular librería JavaScript para la construcción de sitios web y aplicaciones web, se desarrollará con TypeScript ”

TypeScript es cada vez más popular https://thenewstack.io/typescript-getting-popular/

Amigos de TypeScript www.typescriptlang.org/community/friends.html

¿Por qué necesitamos TypeScript? “ A medida que un sistema evoluciona , su complejidad aumenta a menos que se tomen medidas para reducirlo ” “ Las bases de código grandes son más difíciles de mantener cuando se escriben en lenguajes de programación dinámicos ”

Complejo !== Complicado Complicado implica ser difícil de entender pero que con tiempo y esfuerzo se puede llegar a entender . Complejo describe las interacciones entre una serie de entidades . Si el número de entidades y las interacciones entre ellas aumenta, llegaremos a un punto en el que es imposible llegar a entender todas estas entidades y sus relaciones.

Complejidad y entidades TypeScript nos ayuda a enfrentar el nivel de complejidad (entidades y interacción entre ellas) de las aplicaciones JavaScript modernas: Funciones , clases y módulos son entidades. Microservicios son entidades. Ingenieros y equipos de desarrollo son entidades.

Demo 1: TypeScript github.com/stelltec/public-tech-demos/tree/master/nodejs-madrid-meetup/demo1

Un potente y ligero contenedor de inversión del control para aplicaciones JavaScript y Node.js propulsado por TypeScript InversifyJS

Características Support for classes Support for Symbols Container API Declaring container modules Container snapshots Controlling the scope of the dependencies Declaring optional dependencies Injecting a constant or dynamic value Injecting a class constructor Injecting a Factory Auto factory Injecting a Provider (asynchronous Factory) Activation handler Middleware Multi-injection Tagged bindings Create your own tag decorators Named bindings Default target Support for hierarchical DI systems Contextual bindings & @targetName Property injection Circular dependencies Inheritance

Inyección de dependencias Patrón de diseño en el que se suministran objetos a una clase en lugar de ser la propia clase la responsable de la creación de dicho objeto. Inversión de dependencias La noción de que se debe “depender de abstracciones, no depender de implementaciones” introducida por Robert C. Martin.

Contenedores de inversión de control (IoC) La inversión de control es un principio de diseño que permite a una herramienta tomar el control de ciertos aspectos en una aplicación. “La inversión del control es un término demasiado genérico, y por lo tanto la gente lo encuentra confuso” - Martin Fowler, Chief Scientist @ ThoughtWorks Un contenedor IoC toma el control de la inyección de dependencias y la gestión de su ciclo de vida (scope). Tal vez debería llamarse contenedor de inyección de dependencias. Sin embargo, el nombre de contenedor IoC parece ser el más usado.

Desmontando las leyendas urbanas sobre los contenedores de inversión de control en JavaScript “ En general, cuando voy a una conferencia sobre JavaScript y hablo sobre la inyección de dependencias la gente se pregunta ¿Qué?, ¿Qué es la inyección de dependencias? ¿Por qué alguien haría algo así?... Me encanta visitar Build (Conferencia de Microsoft para desarrolladores) porque puedo hablar sobre la inyección de dependencias y todo el mundo en esta habitación está probablemente convencido de que es una buena idea ” - Rob Wormald, Developer Advocate @ Google

Desmontando las leyendas urbanas sobre los contenedores de inversión de control en JavaScript “No hay lugar para contenedores IoC en JavaScript” “No necesitamos contenedores de IoC, ya tenemos cargadores de módulos!” “Inversión de dependencias === inyección de dependencias”

Demo 2: InversifyJS github.com/stelltec/public-tech-demos/tree/master/nodejs-madrid-meetup/demo2

Como acabamos de demostrar: Los contenedores IoC se convertirán en una necesidad como resultado del aumento en la complejidad de las aplicaciones JavaScript. El hecho de que dos entidades estén declaradas en ficheros diferentes no quiere decir que estas estén desacopladas. El hecho de que una entidades sea inyectada dentro de otra no quiere decir que estas estén desacopladas. Deberíamos depender de abstracciones (interfaces), no de concreciones (clases).

I nyección de dependencias Car → PetrolEngine Facil de testear 50% Desacoplado I nversión de dependencias Car → Engine ← PetrolEngine Facil de testear 100% Desacoplado

Utilidades para el desarrollo de aplicaciones Node.js con Express & InversifyJS i nversify-express-utils & arquitectura en capas de cebolla

Características Inyección de dependencias Programación orientada a atributos (@decoradores) Seguridad y protección de tipos Enrutamiento declarativo (@Controller, @Method, @Get, @Post, @Put, @Patch, @Head, @Delete y @All) Procesado declarativo de peticiones HTTP (@Request, @Response, @RequestParam, @QueryParam, @RequestBody, @RequestHeaders, @Cookies y @Next)

Arquitecturas y patrones basados en la inversión de dependencias y la inversión de control Puertos y adaptadores / arquitectura hexagonal “Capas, cebollas, puertos, adaptadores: todo es lo mismo” - Mark Seemann, Autor de Dependency Injection in .NET Arquitectura en capas de cebolla Arquitectura limpia

La arquitectura en capas de cebolla La esencia de la arquitectura en capas de cebolla es la aplicación del principio de Inversión de dependencia entre las capas de una aplicación .

Diferencias entre la arquitectura cebolla y la arquitectura de n capas La principal diferencia entre la arquitectura en capas de cebolla y la arquitectura de n capas es la dirección de las dependencias.

Demo 3: InversifyJS + Express github.com/stelltec/public-tech-demos/tree/master/nodejs-madrid-meetup/demo3

Enrutamiento declarativo Al lanzarse la aplicación cada controlador es registrado junto a una URL. Una petición HTTP llega a la aplicación. El router descubre que controlador es necesario basándose en la URL de la petición. El router resuelve una instancia del controlador necesario y todas sus dependencias. El router procesa la requests y formatea los argumentos de la acción. La acción es invocada. Si la acción devuelve una promesa, el router la resolverá por nosotros. El resultado de la acción es enviado en la respuesta HTTP.

La arquitectura en capas de cebolla http://bit.ly/2r9fzsz Las capas del exterior contienen más detalles (implementaciones) que las capas del interior (abstracciones). Las capas del exterior dependen de las capas del interior pero no al contrario.

¿Preguntas ?

Gracias! Muchisimas gracias por vuestra atención! ★ github.com/inversify/InversifyJS ★ github.com/inversify/inversify-express-utils ★ github.com/inversify/inversify-express-example ★ github.com/stelltec/public-tech-demos/tree/master/nodejs-madrid-meetup www.stelltec.com www.inversify.io www.remojansen.com @InversifyJS @RemoHJansen @DubTypeScript