Bağımlılık Enjeksiyonu
Servislerin Serbest Bırakılması
app.dispose ve provider.dispose ile servis temizliği, gezinme kapsamının kapanması, transient örneklerin izlenmesi.
Servislerin Serbest Bırakılması
Sağlayıcı kurduğu örnekleri kendisi serbest bırakır. Bir servis zamanlayıcı, dinleyici ya da bağlantı gibi bir kaynak tutuyorsa onu bırakan bir dispose() metodu yazılır; çağırmak sağlayıcının işidir:
@Injectable({ lifetime: "singleton" })
export class SyncService {
private timer = setInterval(() => this.pull(), 60_000);
async pull() {
const response = await fetch("/api/notes");
return response.json();
}
dispose() {
clearInterval(this.timer);
}
}
@Injectable({ lifetime: "singleton" })
export class SyncService {
timer = setInterval(() => this.pull(), 60_000);
async pull() {
const response = await fetch("/api/notes");
return response.json();
}
dispose() {
clearInterval(this.timer);
}
}
Ne zaman serbest bırakılır:
app.dispose()servisleri bileşen ağacı (leave animasyonları dahil) söküldükten sonra serbest bırakır; o ana kadar her bileşeninonDisposing/onDisposed'u aynı servisleri görür veawait app.dispose()asyncdispose'ları da bekler.app.dispose()veprovider.dispose()sağlayıcının kurduğu örnekleri serbest bırakır: singleton önbelleği, kapsamlarınscopedörnekleri ve gezinme kapsamları.- Gezinme kapsamı, yerini yeni bir gezinme aldığında ya da gezinme iptal edildiğinde kapanır ve
scopedörnekleri serbest bırakılır. Kapsama bağlı bir sayfa hâlâ yaşıyorsa (serbest bırakılması süren ayrılan sayfa,keepAliveönbelleğindeki ya da yığında tutulan sayfa) kapsam, o sayfa serbest bırakılana ya da yeniden gösterilene kadar açık kalır.
Nasıl: her örnekte varsa sırayla dispose(), close(), [Symbol.dispose]() ve [Symbol.asyncDispose]() çağrılır; birinin fırlattığı hata diğerlerini durdurmaz.
Yalnız kurulmuş örnekler serbest bırakılır: hiç istenmemiş bir singleton kurulmadığı için serbest de bırakılmaz; useValue ile verilen değer de ancak bir kez çözülmüşse bu işlemden geçer.
transient örnekler varsayılan olarak izlenmez; provider.enableAutoDisposeTransients() açıldığında bir alt kapsamda (createScope, gezinme kapsamı) üretilen transient örnekler o kapsamla birlikte serbest bırakılır. Kök sağlayıcıdan çözülen transient'lar yine izlenmez.
provider.getAllServices() sağlayıcının kullandığı ServiceCollection'ı verir.
Sonraki adım
MotifJS üstüne paket yazmanın dayandığı mekanizmalar için Motif Üstüne Paket Yazmak bölümüne geçin.