You are currently browsing the category archive for the ‘noticias’ category.

Leyendo un rato la lista de cambios de Angular me entero que hay un cambio en los proveedores de la plataforma y el compilador y que se ha reemplazado el inyector reflexivo por uno estático. No todos usamos el ReflectiveInjector directamente en nuestro código así que no parece claro en qué nos afectaría.

Las preguntas, después del salto desde AngularJS y Angular 2, son: ¿por qué es mejor? ¿Cómo nos afecta? ¿Necesitaremos migrar?

¿Por qué reflexivo?

Veamos el siguiente ejemplo

class Resource { }

class Reader {
  constructor(@Inject(Resource) resource) { }
}

const injector = ReflectiveInjector.resolveAndCreate([Reader, Reource]);
const reader = injector.get(Reader);

Tenemos dos servicios y el servicio Reader depende del servicio Resource. Cuando los proveedores van hacia resolveAndCreate no especificamos qué depende de qué. El decorador Inject usa la biblioteca Reflect para asociar metadata a la Reader. (Me gustaría que veamos reflexión y metaprogramación en JS.) 😉

Esencialmente, el decorador Inject hace lo siguiente

function Inject(cls: any, unusedKey: any, index: number) {
  ...  // `parameters` contiene a `{token: Resource}`
  Reflect.defineMetadata('parameters', parameters, cls);
  return cls;
}

Con esto mantenemos la información de las dependencias asociadas a una clase.

Cuando pasamos los proveedores a resolveAndCreate, este recorre cada uno de ellos y recolecta todas sus dependencias usando el mismo objeto Reflect.

function resolveAndCreate(providers) {
  ...
  providers.forEach(provider => resolverReflectiveFactory(provider));
  ...
}

function resolverReflectiveFactory(provider) {
  ...
  if (provider.useClass) {
    const cls = resolve(provider.useClass);
    ...
    resolveDepdenencies = dependenciesFor(cls);
  }
}

Con esto vemos que el inyector se basa en la capacidad de reflexión provista por Reflect (y el lenguaje) para extraer las dependencias y hacernos la programación de ello implícita.

¿Cómo difiere del inyector estático?

Este nuevo inyector es más rápido ya que de momento los navegadores y javascript no soporta reflexión de manera “nativa”. Por ejemplo, este almacena en un mapa todas nuestras clases.

const getOrCreateMetadataMap = (target, targetKey, create) {
  const targetMetadata = store.get(target);
  if (!targetMetadata) {
    if (!create) return;
    store.set(target, targetMetadata = new Map);
  }
}

Personalmente, supongo que con la llegada de los decoradores en ES7, Reflect ya no sería necesario, por lo tanto, sería removido en el futuro.

¿Cómo nos afecta?

El inyector reflexivo no se hace explícito cuando creamos módulos. No obstante, Angular crea otros tres inyectores para Platform, Compiler y NgZone, opr lo que el uso ReflectiveInjector los afectará.

Notemos que nosotros usamos una línea como la siguiente:

platformBrowserDynamic().bootstrapModule(AppModule);

La primer llamada toma los proveedores de la plataforma. La segunda inicia el compilador JIT y toma sus proveedores. Con esto quiero decir que podríamos pasar los proveedores al inyector de la plataforma mediante

class B { }
class A { constructor(@Inject(B) b) { } }

platformBrowserDynamic([A, B])

y, al compilador,

class D { }
class C { constructor(@Inject(D) d) { } }

bootstrapModule(AppModule, {providers: [C, D]});

Ya que la plataforma migrará al inyector estático, no podremos resolver de manera implícita las dependencias mediante la metadata. De manera que tendremos que adaptar nuestro código.

class B { }
class A { constructor(@Inject(B) b) { } }

platformBrowserDynamic([{provide: A, useClass: A, deps: [B]}, B]);

class D { }
class C { constructor(@Inject(D) d) { } }

bootstrapModule(AppModule, {
  providers: [
    { provide: A, useClass: A, deps: [B] },
    B
  ]
});

Para quienes se hayan enfrentado al problema de inyectar en inyectables, esto no resultará extraño. Pero no nos preocupes. Como dije, esto sólo afecta a inyector de la plataforma y del compilador. Como el inyector reflexivo está marcado como “deprecated”, es buena idea que vayamos migrando hacia el nuevo inyector estático, en tanto lo hayamos usado en nuestro código.

Anuncios

La naturaleza de las líneas de Nazca es un misterio que los expertos tratan de desvelar desde hace bastante tiempo atrás. Ahora, Rosa Lasaponara y un equipo del Instituto de Metodologías para Análisis Medioambiental en Italia, cree tener algunas respuestas usando imágenes por satélite.

Antiguo misterio peruano resuelto desde el espacio

Categorías