Constructor injection
Injicér afhængigheder via konstruktører på en ren måde
Constructor injection er en gratis TypeScript Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i TypeScript Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. TypeScript Academy-kurset indeholder 4 lektioner i alt.
Konstruktørinjektion i dybden
Konstruktørinjektion erklærer hver afhængighed som en konstruktørparameter. Objektet er fuldt forbundet, så snart det eksisterer, hvilket gør det umuligt at glemme obligatoriske samarbejdspartnere.
Parameter-egenskaber
TypeScript kan deklarere og tildele en afhængighed i ét trin ved at bruge en adgangsmodifikator på parameteren. private readonly opretter og tildeler automatisk feltet.
interface Mailer { send(to: string, body: string): void; }
class Notifier {
constructor(private readonly mailer: Mailer) {}
}Grænsefladebaserede afhængigheder
Ved at afhænge af en grænseflade i stedet for en klasse kobles brugeren fra enhver bestemt implementering. Ethvert objekt, der matcher grænsefladen, kan leveres.
interface Mailer { send(to: string, body: string): void; }
class SmtpMailer implements Mailer {
send(to: string, body: string) { console.log("SMTP ->", to); }
}Forbindelse ved roden for objektsammensætningen
Det sted, der opretter objektgrafen, er roden for objektsammensætningen. Her vælger du konkrete implementeringer og injicerer dem.
class Notifier {
constructor(private readonly mailer: Mailer) {}
notify(to: string) { this.mailer.send(to, "hello"); }
}
const app = new Notifier(new SmtpMailer());
app.notify("a@b.com");Udskiftning af implementeringer
Fordi afhængigheden er en grænseflade, kan du levere en helt anden implementering uden at røre ved Notifier. Det er den grundlæggende fleksibilitet, DI giver.
class FakeMailer implements Mailer {
sent: string[] = [];
send(to: string) { this.sent.push(to); }
}
const fake = new FakeMailer();
new Notifier(fake).notify("x@y.com");
console.log(fake.sent); // ["x@y.com"]Test uden ægte ind-/uddata
Ved at injicere den falske mailafsender kan en test kontrollere, hvad der ville være blevet sendt, uden at sende en ægte e-mail. Testen er hurtig, deterministisk og isoleret.
const fake = new FakeMailer();
new Notifier(fake).notify("test@site");
console.log(fake.sent.length === 1); // trueFlere afhængigheder
Angiv så mange afhængigheder som nødvendigt. Hver af dem er eksplicit, typebestemt og obligatorisk, hvilket gør klassens behov synlige med et blik.
interface Logger { log(m: string): void; }
class Notifier {
constructor(
private readonly mailer: Mailer,
private readonly logger: Logger,
) {}
}readonly forhindrer gentildeling
Hvis du markerer injicerede felter med readonly, kan de ikke udskiftes midt i levetiden, så objektets samarbejdspartnere forbliver stabile og forudsigelige.
class Notifier {
constructor(private readonly mailer: Mailer) {}
// this.mailer = ... would be a compile error
}Ingen skjult new indeni
En klasse, der bruger konstruktørinjektion, bør ikke oprette sine samarbejdspartnere internt med new. Alle afhængigheder kommer gennem konstruktøren, så koblingen forbliver eksplicit.
Obligatoriske eller valgfrie
Obligatoriske afhængigheder hører hjemme i konstruktøren. Ægte valgfrie afhængigheder kan som standard bruge en implementering uden handling, der stadig sendes ind i stedet for at blive oprettet internt.
const noopLogger: Logger = { log() {} };
new Notifier(new SmtpMailer(), noopLogger);Opsummering af fordelene
Konstruktørinjektion gør afhængigheder eksplicitte, objekter fuldt initialiserede, implementeringer udskiftelige og tests meget enkle. Det er standardstilen til DI af en god grund.
Hurtigt tjek
Et hurtigt tjek af denne lektion.
Opsummering
Konstruktørinjektion erklærer afhængigheder som parametre, ofte private readonly, der er typebestemt af en grænseflade. Roden for objektsammensætningen vælger implementeringerne, og tests sender erstatningsobjekter. Objekter er altid fuldt forbundne, og samarbejdspartnere kan udskiftes uden at redigere klassen.
Lær TypeScript med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 101
- Lektioner
- 352
Ofte stillede spørgsmål
Er lektionen “Constructor injection” gratis?
Ja — hele teksten til “Constructor injection” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af TypeScript Academy-kurset, skal du opgradere til CoddyKit PRO. TypeScript Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Constructor injection”?
Injicér afhængigheder via konstruktører på en ren måde Du øver dig i TypeScript Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på TypeScript Academy?
Der kræves ingen tidligere erfaring. TypeScript Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Constructor injection”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne TypeScript Academy-lektion?
Ja. Alle TypeScript Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Grundlæggende inversion of control
- Constructor injection
- DI-containere med InversifyJS
- Typesikre service-tokens