DI-containrar med InversifyJS
Registrera och lösa tjänster med en container.
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.
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
- Grunderna i Inversion of Control
- Konstruktorinjektion
- DI-containrar med InversifyJS
- Typsäkra tjänstetoken