angular - Er [providers] nødvendig når man gjør konstruktøravhengighetsinjeksjon?
Går gjennom denne todo-opplæringen, og den har følgende:
import {TodoDataService} from './todo-data.service';
@Component({
// ...
providers: [TodoDataService]
})
constructor(private todoDataService: TodoDataService) {
}
Hvis jeg forstår det riktig, må vi deklarere TodoDataService i providers-arrayen. Dette virker overflødig. Kan Angular DI lese de genererte metadataene for komponenten og automatisk injisere TodoDataService ved hjelp av konstruktørinjeksjon?
Oppdater
Angular har implementert dette til en viss grad nå. Jeg ba dem også fjerne providedIn:root, og de sa at de har planer for det på veikartet sitt.
Svar #1
Fra Angular.io-dokumentasjonen:
Injektorbobling
Når en komponent ber om en avhengighet, prøver Angular å tilfredsstille den avhengigheten med en leverandør registrert i komponentens egen injektor. Hvis komponentens injektor mangler leverandøren, sender den forespørselen videre til injektoren til dens overordnede komponent. Hvis den injektoren ikke kan tilfredsstille forespørselen, sender den den videre til sin overordnede injektor. Forespørslene fortsetter å boble opp til Angular finner en injektor som kan håndtere forespørselen, eller til den går tom for overordnede injektorer. Hvis den går tom for overordnede, kaster Angular en feil.
Min forståelse av dette er at hvis komponenten din tilbyr en tjeneste, får du én instans av den tjenesten per komponent. Hvis den ikke gjør det, går den opp i komponenttreet til den finner noe som tilbyr det. Så noe må tilby det.
Jeg tror det faktisk faktisk sjekker de genererte metadataene, men det bruker det bare for å se hvilken tjeneste komponenten trenger, ikke hvor tjenesten kommer fra (som er hva providers:[TodoDataService] er for).
I min applikasjon blir de fleste av tjenestene mine levert i min app.module.ts, så jeg får én instans av hver tjeneste gjennom hele appen.