StaticInjector против ReflectiveInjector в угловой
Angular 5.x будет включать в себя новые StaticInjector
как упоминалось в этом твите. У меня есть два вопроса:
- Чем он отличается от существующего ReflectiveInjector?
- Это сломает какой-либо из моих существующих кодов?
1 ответ
Во-первых, есть отличная статья. Angular представляет StaticInjector. Должны ли вы заботиться? это объясняет разницу в деталях.
Чем он отличается от существующего ReflectiveInjector?
ReflectiveInjector
Полагается на возможности отражения, предоставляемые Reflect
библиотека для извлечения неявных зависимостей для провайдера, отсюда и название Reflective
:
class B {}
class A {
constructor(@Inject(B) b) { } <----- `B` is implicit dependency
}
const i = ReflectiveInjector.resolveAndCreate([A, B]);
@Inject
декоратор определяет метаданные, определяющие неявные зависимости и ReflectiveInjector
использует эти метаданные.
StaticInjector
Не использует отражающие возможности и требует явного указания зависимостей:
class B {}
class A { constructor(b) {} }
const i = Injector.create([{provide: A, useClass: A, deps: [B]]};
const a = i.get(A);
Это сломает какой-либо из моих существующих кодов? Изменения коснутся только поставщиков, поставляемых поставщикам платформ и компиляторов. Так что, если вы предоставили их так:
class B1 {}
class A1 { constructor(@Inject(B1) b) {} }
class B2 {}
class A2 { constructor(@Inject(B2) b) {} }
bootstrapModule(AppModule, {providers: [A1, B1]}).platformBrowserDynamic([A2, B2])
Теперь вы должны изменить это на:
class B1 {}
class A1 { constructor(b) {} }
class B2 {}
class A2 { constructor(b) {} }
platformBrowserDynamic([{ provide: A1, useClass: A1, deps: [B1] }, B1])
.bootstrapModule(AppModule, { providers: [ {provide: A2, useClass: A2, deps: [B2]}, B2 ] })
ReflectiveInjector
все еще помечен как стабильный, так что вы, вероятно, можете продолжить его Но есть большая вероятность, что это будет удалено в будущем. Я предлагаю вам начать использовать StaticInjector
как только это станет доступно.