TypeScript Academy · Lektion

DI-containrar med InversifyJS

Registrera och lösa tjänster med en container.

Lektion 3 av 413 steg

DI-containrar med InversifyJS är en gratis lektion i TypeScript Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för TypeScript Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i TypeScript Academy innehåller totalt 4 lektioner.

Varför en DI-container?

Att koppla ihop stora objektgrafer manuellt är tidskrävande och felbenäget. En DI-container registrerar hur varje beroende ska skapas och löser dem automatiskt. InversifyJS är en populär TypeScript-container.

Installation och aktivering

InversifyJS bygger på dekoratorer och reflektionsmetadata. Importera från inversify och aktivera experimentalDecorators samt reflect-metadata.

import "reflect-metadata";
import { Container, injectable, inject } from "inversify";

Markera klasser med @injectable

Dekoratorn @injectable() talar om för containern att en klass kan skapas och injiceras. Alla klasser som containern skapar behöver den.

import { injectable } from "inversify";

@injectable()
class ConsoleLogger {
  log(m: string) { console.log(m); }
}

Deklarera beroenden med @inject

Använd @inject(token) på konstruktorparametrar för att tala om för containern vilken bindning som ska tillhandahållas. Token identifierar beroendet.

@injectable()
class OrderService {
  constructor(@inject("Logger") private logger: ConsoleLogger) {}
  place() { this.logger.log("placed"); }
}

Skapa en container

En Container innehåller alla bindningar för applikationen. Skapa en vid uppstart och registrera beroenden i den.

import { Container } from "inversify";
const container = new Container();

Binda ett interface till Impl

Det kedjbara API:et bind<T>(token).to(Impl) kopplar en token, ofta ett interface, till en konkret klass som containern instansierar.

interface Logger { log(m: string): void; }
container.bind<Logger>("Logger").to(ConsoleLogger);

Lösa upp tjänster

container.get<T>(token) skapar den begärda tjänsten genom att rekursivt skapa och injicera dess beroenden.

container.bind<OrderService>(OrderService).toSelf();
const svc = container.get<OrderService>(OrderService);
svc.place();

Byta implementationer

Om en annan logger ska användas binds token om till en annan klass. Användarna påverkas inte eftersom de beror på token och inte på den konkreta klassen.

@injectable()
class SilentLogger implements Logger { log() {} }
container.rebind<Logger>("Logger").to(SilentLogger);

Singleton-scope

Som standard kan varje anrop till get skapa en ny instans. Använd inSingletonScope() för att dela en instans i hela applikationen.

container.bind<Logger>("Logger").to(ConsoleLogger).inSingletonScope();

Testa med containern

I tester går det att skapa en ny container och binda fejkobjekt, så att samma fördelar med ihopkopplingen uppnås samtidigt som enheten under test isoleras.

const testContainer = new Container();
testContainer.bind<Logger>("Logger").to(SilentLogger);

Avvägningar med containrar

Containrar minskar mängden standardkod för stora objektgrafer, men lägger till ett beroende, dekoratorer och indirektion. I små applikationer är manuell constructor injection ofta tydligare.

Snabbkontroll

En snabb kontroll av den här lektionen.

Sammanfattning

InversifyJS använder @injectable, @inject(token) och en Container. Du bind<Interface>(token).to(Impl), och container.get löser automatiskt hela beroendegrafen. Det kräver reflect-metadata och dekoratörer, vilket minskar mängden kod på bekostnad av indirektion.

Gratis att börja

Lär dig TypeScript med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
101
Lektioner
352

Vanliga frågor

Är lektionen ”DI-containrar med InversifyJS” gratis?

Ja – hela texten till ”DI-containrar med InversifyJS” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i TypeScript Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i TypeScript Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”DI-containrar med InversifyJS”?

Registrera och lösa tjänster med en container. Ni övar på TypeScript Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig TypeScript Academy?

Du behöver inga förkunskaper. Utbildningen i TypeScript Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”DI-containrar med InversifyJS”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här TypeScript Academy-lektionen?

Ja. Varje TypeScript Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Grunderna i Inversion of Control
  2. Konstruktorinjektion
  3. DI-containrar med InversifyJS
  4. Typsäkra tjänstetoken
← Tillbaka till TypeScript Academy