/ / Ъглови 2 зависимости инжектиране singletons - ъглови, ъглови

Ъглови 2 зависимости инжектиране singletons - ъглови, ъглови

Имам самостоятелен клас, наречен 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.