providedin injector injectiontoken injection injectable example dependency javascript angular typescript dependency-injection

javascript - injector - Angular2 DI en Typescript. ¿Podemos usarlo en proyectos node.js/no angulares?



injectiontoken angular (6)

A partir de Angular 2 RC.5, DI es una parte del paquete @angular/core . Para usos no angulares, Minko Gechev, miembro del equipo Angular, lo extrajo recientemente en el paquete de injection-js j.

Aquí hay un breve ES6, un ejemplo amigable con el nodo:

// may not be needed for injection-js and recent @angular/core versions // if ES5-flavoured `Class` helper isn''t used require(''reflect-metadata''); const { Inject, Injector, ReflectiveInjector, OpaqueToken } = require(''@angular/core''); // or ... = require(''injection-js''); const bread = new OpaqueToken; const cutlet = new OpaqueToken; class Sandwich { constructor(bread, cutlet, injector) { const anotherBread = injector.get(''bread''); injector === rootInjector; bread === ''bread''; anotherBread === ''bread''; cutlet === ''cutlet''; } } Sandwich.parameters = [ new Inject(bread), new Inject(cutlet), new Inject(Injector) ]; const rootInjector = ReflectiveInjector.resolveAndCreate([ { provide: ''bread'', useValue: ''bread'' }, { provide: bread, useValue: ''bread'' }, { provide: cutlet, useValue: ''cutlet'' }, Sandwich ]); const sandwich = rootInjector.get(Sandwich);

¿El contenedor de inyección de dependencia angular2 fue diseñado para uso independiente, y es posible usarlo para aplicaciones de servidor de mecanografía / javascript?

Abrí un problema el 16 de octubre ( https://github.com/angular/di.js/issues/108 ) sobre el proyecto di, que supongo supongo que debería pasar a v2. Aparentemente esto no fue posible. ¿Qué pasa con el nuevo angular2 di? ¿Puedo usarlo de forma independiente con proyectos js / es6 / ts?


Checkout ubiquits sources - de alguna manera integró DI de angular 2 en el back-end.

Si quieres una herramienta de inyección de dependencia sencilla pero poderosa e indolora para typedi mecanografiado y node.js. Funciona muy bien con interfaces angulares también. También revise otros repositorios de este autor, hay muchos componentes que lo ayudarán a crear aplicaciones de nodo utilizando TypeScript.





Por el momento, el código DI Angular 2.0 no parece estar listo para ser consumido por otras bibliotecas.

Me gustaría sugerir una alternativa. He desarrollado un contenedor IoC llamado InversifyJS con funciones avanzadas de inyección de dependencias, como enlaces contextuales. Funciona tanto en el nodo como en los navegadores y algunas partes de su API se basan en la Angular 2 DI API.

Debe seguir 3 pasos básicos para usarlo:

1. Agregue anotaciones

La API de anotación está basada en Angular 2.0:

import { injectable, inject } from "inversify"; @injectable() class Katana implements IKatana { public hit() { return "cut!"; } } @injectable() class Shuriken implements IShuriken { public throw() { return "hit!"; } } @injectable() class Ninja implements INinja { private _katana: IKatana; private _shuriken: IShuriken; public constructor( @inject("IKatana") katana: IKatana, @inject("IShuriken") shuriken: IShuriken ) { this._katana = katana; this._shuriken = shuriken; } public fight() { return this._katana.hit(); }; public sneak() { return this._shuriken.throw(); }; }

2. Declarar enlaces

La API de enlace se basa en Ninject:

import { Kernel } from "inversify"; import { Ninja } from "./entities/ninja"; import { Katana } from "./entities/katana"; import { Shuriken} from "./entities/shuriken"; var kernel = new Kernel(); kernel.bind<INinja>("INinja").to(Ninja); kernel.bind<IKatana>("IKatana").to(Katana); kernel.bind<IShuriken>("IShuriken").to(Shuriken); export default kernel;

3. Resolver dependencias

La API de resolución se basa en Ninject:

import kernel = from "./inversify.config"; var ninja = kernel.get<INinja>("INinja"); expect(ninja.fight()).eql("cut!"); // true expect(ninja.sneak()).eql("hit!"); // true

La última versión (2.0.0) admite muchos casos de uso:

  • JavaScript universal (funciona en Node.js y navegadores)
  • Módulos Kernel
  • Kernel middleware
  • Use clases, cadenas literales o símbolos como identificadores de dependencia
  • Inyección de valores constantes
  • Inyección de constructores de clase
  • Inyección de fábricas
  • Auto fábrica
  • Inyección de proveedores (fábrica asíncrona)
  • Controladores de activación (utilizados para inyectar proxies)
  • Inyecciones múltiples
  • Encuadernaciones etiquetadas
  • Decoradores de etiquetas personalizadas
  • Enlaces nombrados
  • Enlaces contextuales
  • Excepciones amistosas (por ejemplo, dependencias circulares)

Puede obtener más información al respecto en InversifyJS