Angular 6'da Hizmetler oluştururken, Enjekte Edilebilir dekoratör ile sağlanan In'in amacı nedir?


136

Angular CLI'de hizmetler oluştururken, Enjekte edilebilir dekoratör için varsayılan bir "kök" ile "sağlanan" özelliğiyle fazladan meta veri ekliyor.

@Injectable({
  providedIn: 'root',
})

ProvidIn tam olarak ne yapıyor? Bunun hizmeti tüm uygulama için 'global' tipte bir tekli hizmet gibi kullanılabilir hale getirdiğini varsayıyorum, ancak bu tür hizmetleri AppModule sağlayıcı dizisinde bildirmek daha temiz olmaz mı?

GÜNCELLEME:

Başkaları için, aşağıdaki paragraf, özellikle hizmetinizi yalnızca bir özellik modülüne sunmak istiyorsanız, bunun başka bir iyi açıklamasını sağladı.

Artık bir sağlayıcıyı doğrudan @Injectable()dekoratörün içinde , yeni providedIn özniteliği kullanarak kaydetmenin yeni, önerilen bir yolu var . Uygulamanızın 'root'bir değeri veya herhangi bir modülü olarak kabul eder . Eğer kullandığınız zaman 'root', senin injectableuygulamasında bir singleton olarak tescil edilecek ve kök modülünün sağlayıcıları eklemek gerekmez. Benzer şekilde, kullanıyorsanız providedIn: UsersModule, modülün içine eklemeden injectablesağlayıcısı olarak kaydedilir . "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular 6 /UsersModuleproviders

GÜNCELLEME 2:

Daha fazla araştırmadan sonra, yalnızca sahip olmanın yararlı olduğuna karar verdim providedIn: 'root'

provideKök modül dışındaki herhangi bir modülde bir hizmet istiyorsanız providers, özellik modülünün dekoratörlerinde diziyi kullanmanız daha iyi olur , aksi takdirde döngüsel bağımlılıklarla boğuşursunuz. Burada ilginç tartışmalar yapılacak - https://github.com/angular/angular-cli/issues/10170


17
Güncellemelerinizin sorunuza eklemek yerine bir cevap olması gerektiğini düşünüyorum (kendi sorularınızı cevaplayabilirsiniz).
PhoneixS

En önemli kısım SINGLETON, kimse bundan bahsetmiyor!
Kyle Burkett

Yanıtlar:


55

ProvidIn kullanırsanız, enjekte edilebilir, modül sağlayıcılarına eklenmeden Modülün sağlayıcısı olarak kaydedilir.

itibaren Docs

Hizmetin kendisi, CLI'nin oluşturduğu ve @Injectable ile dekore edilmiş bir sınıftır. Varsayılan olarak, bu dekoratör, hizmet için bir sağlayıcı oluşturan bir providedIn özelliği ile yapılandırılır. Bu durumda, providedIn: 'root', hizmetin kök enjektörde sağlanması gerektiğini belirtir.


4
Teşekkürler Sajeetharan. Tamam, bu hizmetin nerede sağlanması gerektiğini belirlemenin yeni bir kısayol yolu gibi görünüyor. Sanırım ilk tercihim, ProvidedIn etiketleri için dağınık kod tabanını incelemek yerine, sağlayıcı olarak bildirilen tüm hizmetleri görmek için bir modülün sağlayıcı listesine bakmak olurdu .... (?)
Stefan Zvonar

2
Angular'ın bunu eklemesi için herhangi bir sebep var mıydı? Bunun çözmekte olduğu bir sorun var mı? Bunun bir nedeni olduğunu görmüyorum.
prolink007

3
AppModule / CoreModule tanımını biraz daha küçük tutar;)
Stefan Zvonar

22
@ prolink007. Sağlananın kullanılması, hizmetlerin uygulama tarafından geç yüklenmesine izin verir. Bunu test etmek için hizmetlerinize konsol günlükleri koyun. Ana sayfam eskiden 16 hizmet yüklüyordu, şimdi 9 yükleniyor. Performansı ölçmek zor, ancak ihtiyaç duyulana kadar hizmetleri yüklemediğimi bilerek daha iyi hissediyorum :).
Stevethemacguy

3
Dekoratör kullanılırken providedInhizmetin nerede başlatılması gerektiğini tanımlamak için özniteliği kullanarak hizmetlerinizi ağaç sarsılabilir hale getirebilirsiniz @Injectable(). Daha sonra bunu, NgModulebildiriminizin sağlayıcılar özniteliğinden ve import deyiminden kaldırmanız gerekir.Bu, kullanılmayan kodu pakette kaldırarak paket boyutunu azaltmaya yardımcı olabilir.
nircraft

48

providedIn: 'root' Angular 6'dan bu yana hizmet sağlamanın en kolay ve en verimli yoludur:

  1. Hizmet, bir modülün sağlayıcı dizisine (Angular <= 5 gibi) eklenmesine gerek kalmadan uygulama genelinde tekil olarak sunulacaktır.
  2. Hizmet yalnızca tembel yüklü bir modül içinde kullanılıyorsa, bu modülle tembel olarak yüklenir
  3. Hiç kullanılmazsa, yapıya dahil edilmeyecektir (ağaç sallandı).

Daha fazla bilgi için belgeleri ve NgModule SSS'lerini okumayı düşünün

btw:

  1. Uygulama çapında bir tekli istemiyorsanız, bunun yerine sağlayıcının bileşen dizisini kullanın.
  2. Kapsamı, başka hiçbir geliştiricinin hizmetinizi belirli bir modülün dışında kullanmaması için sınırlamak istiyorsanız, providersbunun yerine NgModule dizisini kullanın.

38

Dokümanlar'dan

Enjekte edilebilir dekoratör nedir?

Enjektör oluşturma için bir sınıfı kullanılabilir olarak işaretler.

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

Hizmetin kendisi, CLI'nin oluşturduğu ve @Injectable () ile dekore edilmiş bir sınıftır.

ProvidIn tam olarak ne yapıyor?

Bir @NgModule veya başka bir InjectorType ile ilişkilendirerek veya bu enjektablın çoğu uygulamada uygulama düzeyinde enjektör olacak olan 'kök' enjektörde sağlanması gerektiğini belirterek hangi enjektörlerin enjekte edilebileceğini belirler.

providedIn: Type<any> | 'root' | null

providedIn: 'root'

Hizmeti kök düzeyinde sağladığınızda, Angular tek, paylaşılan bir hizmet örneği oluşturur ve bunu isteyen herhangi bir sınıfa enjekte eder. Sağlayıcının @Injectable () meta verisine kaydedilmesi, Angular'ın bir uygulamayı, eğer kullanılmıyorsa, derlenmiş uygulamadan kaldırarak uygulamayı optimize etmesine de izin verir.

Sağlanan: Modül

Bir hizmetin belirli bir @NgModule içinde sağlanması gerektiğini belirtmek de mümkündür. Örneğin, oluşturduğunuz bir modülü içe aktarmadıkları sürece bir hizmetin uygulamalar tarafından kullanılabilir olmasını istemiyorsanız, hizmetin modülde sağlanması gerektiğini belirtebilirsiniz.

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

Bu yöntem, hiçbir şey enjekte etmezse hizmetin Ağaç sallamasını ( Ağaç sallama , kullanılmayan kodu bir kod tabanından kaldıran bir oluşturma işleminde bir adımdır) sağladığı için tercih edilir .

Hizmette hangi modülün sunması gerektiğini belirtmek mümkün değilse, modül içinde hizmet için bir sağlayıcı da beyan edebilirsiniz:

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}

4
En iyi açıklama.
nop

2
bu cevap, açısal dokümandaki tanımdan daha iyidir. çok açık.
Shameera Anuranga

2
Çok iyi açıkladı, çok teşekkürler!
Zaki Mohammed

Ya boş olduğunda, mesela @Injectable()?
Ben Taliadoros

13

SağlananIn, Angular'a Hizmetinizin bir örneğini oluşturmaktan kök enjektörün sorumlu olduğunu söyler. Bu şekilde sağlanan hizmetler otomatik olarak tüm uygulamanın kullanımına sunulur ve herhangi bir modülde listelenmeleri gerekmez.

Hizmet sınıfları kendi sağlayıcıları olarak hareket edebilir, bu nedenle bunları @ Enjekte edilebilir dekoratörde tanımlamak, ihtiyacınız olan tek kayıttır.


4

Göre Documentation:

Sağlayıcının @Injectable () meta verisine kaydedilmesi, Angular'ın bir uygulamayı, eğer kullanılmıyorsa, derlenmiş uygulamadan kaldırarak uygulamayı optimize etmesine de izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.