Winkel-6+ :ProvidedIn ein nicht-root-Modul verursacht eine zirkuläre Abhängigkeit
Ich bin versucht, einen zu lösen-service über die neue providedIn
Attribut.
Dies ist eine übersetzungen resolver, welches ich in einem geschützten Modul:
JS:
import { Injectable } from '@angular/core';
import { Observable , pipe } from 'rxjs';
import {map} from "rxjs/operators";
//This is causing: "WARNING in Circular dependency detected:"
import {ProtectedModule} from "../../../protected/protected.module";
import { HttpHandlerService } from '../../http/http-handler.service';
@Injectable({
providedIn: ProtectedModule //Over here (I need the import for this line)
})
export class TranslationsResolverService {
constructor(private _httpHandlerService : HttpHandlerService) { }
resolve(): any {
//Do Something...
}
}
Als ich erklärte, dass die übersetzungen resolver service in den geschützten routing-Modul:
JS:
import { NgModule } from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {AuthGuard} from "../core/resolvers/auth/auth.guard";
import {TranslationsResolverService} from "./../core/resolvers/translations/translations-resolver.service";
const routes: Routes = [
{
path : 'app' ,
component: ProtectedComponent,
resolve : {
translations : TranslationsResolverService //<---- Over here - i can't remove that of course
},
canActivate: [AuthGuard],
]
}
];
@NgModule({
imports : [RouterModule.forChild(routes)],
exports : [RouterModule]
})
export class ProtectedRoutingModule { }
Aufgrund der Tatsache, dass ich importieren (Typoskript import) die protected.module
im translations-resolver.service.ts
, um es zu benutzen in der providedIn
Attribut ich bekomme eine WARNUNG in die Zirkuläre Abhängigkeit erkannt:
path/to/translations-resolver.service.ts ->
protected/protected.module.ts ->
protected/protected-routing.module.ts ->
path to translations-resolver.service.ts
Den 2. Pfad (protected/geschützt.- Modul.ts) Hinzugefügt wird aufgrund der providedIn
Attribut.
Kann ich dieses Problem beheben, indem Sie einfach die Bereitstellung der translationsResolver
als NgModule provider
(in der Anbieter-array ist), aber ich bevorzuge es, ein injectable
Anbieter.
Irgendwelche Vorschläge für die Lösung dieses?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht ein Winkel-Abhängigkeiten problem.
Den Zirkelbezug erzeugt wird, durch den TypeScript-compiler, wenn es versucht zu beheben die kreisförmige Importe.
Erste Lösung
Erstellen Sie ein neues Modul mit dem Namen
ProtectedResolversModule
und verwendenprovidedIn: ProtectedResolversModule
und bewegen Sie den Resolver gibt.Jetzt können Sie importieren Sie das Modul in
ProtectedModule
und Sie nicht bekommen eine zirkuläre Abhängigkeit Fehler beim ladenProtectedRoutingModule
.Zweite Lösung
Verwenden Sie die
providers
array vonProtectedModule
.Ich lief in das gleiche problem. Stellt sich heraus das die Lösung ist "nicht", wie in diesem thread von einem der Kantigen Jungs: https://github.com/angular/angular-cli/issues/10170#issuecomment-380673276
Worauf es hinausläuft services einfacher zu Baum zu schütteln, wenn Sie durch die root-Modul, als ich sammeln.
Bin ich genauso enttäuscht wie Sie sind.
Glaube ich Eckig gemacht haben, ein bisschen ein Durcheinander des
providedIn
syntax. Es scheint verwirrt zu haben, eine Menge Menschen. E. g. diese zwei github-threads:Den
providedIn
syntax zu haben scheint 2 main Vorteile:providedIn: 'root'
sorgt dafür, dass Sie nur jemals eine Instanz des serviceAber Sie benötigen eigentlich nur (1) wenn Sie schreiben eine Bibliothek eher als eine Anwendung (denn warum würden Sie eine Dienstleistung, die Sie gar nicht brauchen, in Ihrer Anwendung), und vermeiden Sie mehrere service-Instanzen (2), indem man einfach sicher, dass Sie nicht importieren, das service-Modul mehr als einmal.
Den Probleme mit der
providedIn
syntax:providedIn: 'root'
bricht die Verbindung zwischen dem service und dem Modul "Leben in" (oder "mit") - weil der Dienst nicht zu wissen, über das Modul und das Modul weiß nicht, über das service. Dies bedeutet, dass der Dienst nicht mehr wirklich "gehört", um das Modul, und wird nur erhalten gebündelt mit dem, was die es verweist. Dies wiederum bedeutet, dass es nun bis zum service Verbraucher um sicherzustellen, dass der Dienst injizierbaren Abhängigkeiten (wenn überhaupt) verfügbar sind, bevor es benutzt wird, ist verwirrend und ziemlich unlogisch.Dies ist im Gegensatz zu offiziellen Angulare Orientierung, aber mein Rat wäre: nicht verwenden
providedIn
, es sei denn, Sie schreiben eine Drittanbieter-Bibliothek, die benötigt Baum-schütteln - verwenden Sie die alten (nicht veralteten)providers
syntax für das Modul statt, d.h.:@NgModule({
providers: [MyService],
})
Nachtrag
Habe ich 5 up-votes jetzt für diese Antwort, so fühle ich mich, als ob ich sollte kommen sauber und sagen, dass ich mich nicht mehr wirklich nach meiner eigenen Ratschläge, die auf dieser!
Seit dem offiziellen (und auch weitgehend befolgt) Winkel-Richtlinie ist die Verwendung
providedIn: 'root'
habe ich beschlossen, dass auf der gesamten, es wäre weniger verwirrend für die anderen Entwickler, wenn ich blieb nur mit diesem. So weit es hat nicht verursacht mir keine Probleme, aber die Vorbehalte, die oben bleiben, und ich glaube, es ist wichtig zu bleiben bewusst.Überprüfen forwardRef() Funktion von Winkel - /Kern. Es ermöglicht das finden von Referenzen, die noch nicht definiert.