Bağımlılık enjeksiyonu (DI) sistemi, mevcut enjektörün kullanılabilir olduğu bir çalışma zamanı bağlamına dayanır.
Bu, enjektörlerin yalnızca kodu bu bağlam içinde çalıştırdığınızda çalıştığı anlamına gelir.
Aşağıdaki durumlarda kullanılabilir bir enjeksiyon bağlamınız olur:
- DI sistemi tarafından örneklenen bir sınıfın, örneğin
@Injectableveya@Component, oluşturulması sırasında (constructoraracılığıyla). - Bu tür sınıfların alan başlatıcılarında.
- Bir
Providerveya@InjectableiçinuseFactoryolarak belirtilen fabrika fonksiyonunda. - Bir
InjectionTokeniçin belirtilenfactoryfonksiyonunda. - Bir enjeksiyon bağlamında çalışan bir yığın çerçevesi içinde.
Bir enjeksiyon bağlamında ne zaman olduğunuzu bilmek, bağımlılıkları almak için inject fonksiyonunu kullanmanıza olanak tanır.
NOTE: Sınıf constructor'larında ve alan başlatıcılarında inject() kullanmanın temel örnekleri için genel bakış kılavuzuna bakın.
Bağlamdaki yığın çerçevesi
Bazı API'ler bir enjeksiyon bağlamı içinde çalışacak şekilde tasarlanmıştır. Bu, örneğin rota korumaları için geçerlidir. Bu, koruma fonksiyonu içinde servislere erişmek için inject kullanmanıza olanak tanır.
İşte CanActivateFn için bir örnek
const canActivateTeam: CanActivateFn = (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
) => {
return inject(PermissionsService).canActivate(inject(UserToken), route.params.id);
};
Bir enjeksiyon bağlamında çalıştırma
Zaten bir enjeksiyon bağlamında olmadan bir fonksiyonu bir enjeksiyon bağlamı içinde çalıştırmanız gerekiyorsa, runInInjectionContext kullanabilirsiniz.
Bu, EnvironmentInjector gibi bir enjektöre erişim gerektirir:
hero.service.ts
@Injectable({
providedIn: 'root',
})
export class HeroService {
private environmentInjector = inject(EnvironmentInjector);
someMethod() {
runInInjectionContext(this.environmentInjector, () => {
inject(SomeService); // Enjekte edilen service ile ihtiyacınız olanı yapın
});
}
}
inject'in yalnızca enjektör istenen token'ı çözebiliyorsa bir örnek döndürdüğünü unutmayın.
Bağlamı doğrulama
Angular, mevcut bağlamın bir enjeksiyon bağlamı olduğunu doğrulamak ve değilse net bir hata fırlatmak için assertInInjectionContext yardımcı fonksiyonunu sağlar. Hata mesajının doğru API giriş noktasına işaret etmesi için çağıran fonksiyona bir referans iletin. Bu, varsayılan genel enjeksiyon hatasından daha net ve uygulanabilir bir mesaj üretir.
import {ElementRef, assertInInjectionContext, inject} from '@angular/core';
export function injectNativeElement<T extends Element>(): T {
assertInInjectionContext(injectNativeElement);
return inject(ElementRef).nativeElement;
}
Bu yardımcıyı bir enjeksiyon bağlamından (constructor, alan başlatıcı, sağlayıcı fabrikası veya runInInjectionContext aracılığıyla çalıştırılan kod) çağırabilirsiniz:
import {Component, inject} from '@angular/core';
import {injectNativeElement} from './dom-helpers';
@Component({
/* … */
})
export class PreviewCard {
readonly hostEl = injectNativeElement<HTMLElement>(); // Alan başlatıcı bir enjeksiyon bağlamında çalışır.
onAction() {
const anotherRef = injectNativeElement<HTMLElement>(); // Başarısız: enjeksiyon bağlamı dışında çalışır.
}
}
Bağlam dışında DI kullanma
Bir enjeksiyon bağlamı dışında inject veya assertInInjectionContext çağırırsanız, Angular NG0203 hatasını fırlatır.