Имам самостоятелен клас, наречен Poller
, Искам да инжектирам споделени конфигуриран инстанции от този клас в различни компоненти. Например, ако опитам следното:
export const QuickPollingService = new OpaqueToken("quickPoller");
export let quickPollingServiceProvider = provide(QuickPollingService, {
useFactory: () => {
return new Poller(200);
},
});
export const SlowPollingService = new OpaqueToken("slowPoller");
export let slowPollingServiceProvider = provide(SlowPollingService, {
useFactory: () => {
return new Poller(1000);
},
});
Инжектирането, както е показано по-долу (с правилен път за импортиране), ми дава име, което не е намерено грешка:
export class ImageComponent {
constructor(
private element: ElementRef,
private poller: QuickPollingService
) {}
}
Какъв е правилният начин за инжектиране на конфигуриран потребителски клас в ъглово 2?
Отговори:
1 за отговор № 1Трябва да използвате @Inject
декоратор във вашия случай, за да инжектирате зависимостта си!
export class ImageComponent {
constructor(
private element: ElementRef,
@Inject(QuickPollingService) private poller: Poller
) {}
}
Във вашия случай QuickPollingService
съответства на непрозрачно означение и не е типът (клас), който искате да инжектирате. Искате да инжектирате тип Poller
който се създава чрез доставчика, регистриран с непрозрачното означение QuickPollingService
.
Всъщност, достатъчно е следното:
export let quickPollingServiceProvider = provide(Poller, {
useFactory: () => {
return new Poller(200);
}
});
В този случай можете да използвате следното:
export class ImageComponent {
constructor(
private element: ElementRef,
private poller: Poller
) {}
}
2 за отговор № 2
употреба @Inject()
за OpaqueToken
Ако използвате
provide(SomeOpaqueToken ...
тогава трябва да инжектирате като
export class ImageComponent {
constructor(
private element: ElementRef,
// v added decorator
@Inject(SomeOpaqueToken) private poller: QuickPollingService
) {}
}
Използвайте типа вместо OpaqueToken
в противен случай регистрирайте доставчика
export let quickPollingServiceProvider = provide(Poller, {
useFactory: () => {
return new Poller(200);
},
});
(не използвайте OpaqueToken
в такъв случай)
Също така се уверете, че добавяте доставчика някъде
bootstrap(AppComponent, [quickPollingServiceProvider]);
Типичен случай на употреба за OpaqueToken
OpaqueToken
може да се използва, когато не можете или не да искате да използвате конкретен тип за регистриране и искане за зависимост.
Вместо един OpaqueToken
можете също така да използвате само низ.
Ако искате да инжектирате примитивна стойност, при която типът не е достатъчно отличителен, трябва да го използвате OpaqueToken
или низ. Например, когато искате да инжектирате някаква конфигурационна стойност.
@Injectable()
class Poller {
constructor(@Inject("pollingInterval" private interval:number) {}
}
bootstrap(AppComponent, [
provide("pollingInterval": {useValue: 200}),
Poller]);
По този начин вашият доставчик ще бъде опростен и няма да се наложи да използвате фабрика, защото interval
зависимостта от Poller
се предоставя от Angulars DI.