it-swarm.com.de

winkelabhängigkeit 6 Abhängigkeitsinjektion

In der neuesten Version von Angular 6 wird ein Dienst in einem Modul mit der Eigenschaft providedIn in den Dienstmetadaten registriert:

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

Die Dokumentation bezieht sich jedoch auch auf die Registrierung des Services im Modul providers in den Modul-Metadaten, genau wie in Angular 5:

@NgModule({
  providers: [HeroService],
})
export class AppModule {}

welche Methode sollte verwendet werden, um den Injektor über den Service zu informieren, den er injizieren soll? Ist die Array-Methode des Modulanbieters veraltet?

47
Hamed Baatour

Grundsätzlich können Sie eine der beiden Optionen verwenden. Gemäß der neuen CLI wird provideIn beim Erstellen von service automatisch hinzugefügt.

bereitgestellt in

Es gibt jetzt einen neuen empfohlenen Weg, um einen Anbieter direkt zu registrieren innerhalb des @Injectable()-Dekorators mit dem neuen BereitgestelltenIn Attribut. Es akzeptiert 'root' als Wert oder ein beliebiges Modul Ihres Anwendung. Wenn Sie 'root' verwenden, wird Ihr injizierbares registriert als Singleton in der Anwendung, und Sie müssen es nicht zur .__ hinzufügen. Anbieter des Wurzelmoduls. Ähnlich, wenn Sie providedIn: UsersModule, .__ verwenden. das injizierbare ist als Anbieter der .__ registriert. UsersModule, ohne es den Anbietern des Moduls hinzuzufügen.

Dieser neue Weg wurde eingeführt, um ein besseres Baumwackeln in der .__ zu haben. Anwendung. Derzeit wird ein Dienst zu den Anbietern eines Moduls hinzugefügt landet im letzten Bundle, auch wenn es nicht in der .__-Datei verwendet wird. Anwendung, die ein bisschen traurig ist.

Weitere Informationen finden Sie hier

59
Pardeep Jain

Wie immer, wenn mehrere Lösungen verfügbar sind, hängt es davon ab, was Sie erreichen möchten. Aber die Dokumentation gibt Ihnen einige Anweisungen zur Auswahl.

Manchmal ist es nicht wünschenswert, dass ein Dienst immer in .__ bereitgestellt wird. der Applikations-Root-Injektor. Möglicherweise sollten Benutzer explizit die Option aktivieren um den Dienst zu nutzen, oder der Dienst sollte in einer .__ bereitgestellt werden. faul geladener Kontext. In diesem Fall sollte der Anbieter verbunden sein mit einem bestimmten @NgModule class und wird von wem auch immer Injektor enthält dieses Modul.

Grundsätzlich verwenden Sie providedIn: 'root' für alle Dienste, die anwendungsübergreifend sind. Für andere Dienste verwenden Sie weiterhin die alte Version.

Vergessen Sie nicht, dass Sie bereits die Wahl hatten, den Service anders anzubieten. Es ist beispielsweise auch möglich, Injectable auf Komponentenebene zu deklarieren (dies ändert sich in V6 nicht).

  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

Auf diese Weise wird der Dienst nur in MyComponent und seiner Unterkomponentenstruktur verfügbar.

9
JEY

Wenn Sie den angle 5+ -Entwickler verwenden, wird der injizierbare Dienst automatisch erstellt, wenn er als Bereitgestellt deklariert wird. Sie können es direkt in einer anderen Komponente verwenden.

1
Prashant

Die Dekoratoren @NgModule() und @Component() verfügen über die Metadaten-Option des Providers, mit der Sie Provider für Injektoren auf NgModule-Ebene oder Komponentenebene konfigurieren können.

Der @Injectable () - Dekorator verfügt über die Metadatenoption "withinIn", mit der Sie den Anbieter der dekorierten Serviceklasse mit dem Stamminjektor oder mit dem Injektor für ein bestimmtes NgModule angeben können.

In Ihrem Fall, da es auf "root" -Ebene bereitgestellt wurde, müssen Sie dies nicht erneut als Anbieter im Modul hinzufügen.

Mehr über Abhängigkeitseinspritzung hier

0
CharithJ