Dependency Injection Container für TypeScript: Vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist ein Dependency Injection Container für TypeScript?



Dependency Injection (DI) ist ein Entwurfsmuster, bei dem ein Objekt seine Abhängigkeiten von außen erhält, anstatt sie selbst zu erstellen. Ein DI-Container ist ein Werkzeug, das die Erstellung und Injektion dieser Abhängigkeiten automatisch verwaltet. In TypeScript sind DI-Container dank der statischen Typisierung besonders effektiv: Sie gewährleisten Typsicherheit und vereinfachen das Testen.



Die Hauptaufgabe des Containers besteht darin, Schnittstellen mit ihren konkreten Implementierungen zu verknüpfen und Abhängigkeitsketten aufzulösen. Dies ermöglicht das Schreiben von lose gekoppeltem, modularem Code, der leicht zu warten und zu erweitern ist.



Warum braucht man einen DI-Container in TypeScript?



  • Reduzierung der Code-Kopplung — Klassen hängen nicht von konkreten Implementierungen ab, sondern nur von Abstraktionen (Schnittstellen).
  • Vereinfachung des Testens — Abhängigkeiten können leicht durch Mocks oder Stubs ersetzt werden.
  • Lebenszyklusverwaltung — Der Container kann Singletons, transiente Objekte oder Objekte mit einem bestimmten Gültigkeitsbereich erstellen.
  • Automatische Auflösung von Abhängigkeiten — Der Container erstellt selbstständig den Abhängigkeitsbaum und erspart dem Entwickler die manuelle Objektkonstruktion.


Beliebte DI-Container für TypeScript



Betrachten wir zwei der am weitesten verbreiteten Bibliotheken: InversifyJS und TSyringe. Beide unterstützen TypeScript, verfolgen jedoch unterschiedliche Ansätze.



1. InversifyJS



InversifyJS ist ein leistungsstarker IoC-Container mit Dekorateuren. Er erfordert die explizite Angabe von Abhängigkeiten über die Dekorateure @injectable() und @inject(). Geeignet für große Projekte mit einer klaren Architektur.



Installation

npm install inversify reflect-metadata --save


Aktivieren Sie in der Datei tsconfig.json unbedingt:

{  "compilerOptions": {    "experimentalDecorators": true,    "emitDecoratorMetadata": true  }}


Anwendungsbeispiel

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

// Schnittstelle und Symbol für die Bindung definiereninterface ILogger { log(message: string): void;}const TYPES = { ILogger: Symbol.for("ILogger"), IUserService: Symbol.for("IUserService"),};

// Logger-Implementierung@injectable()class ConsoleLogger implements ILogger { log(message: string): void { console.log(`[LOG]: ${message}`); }}

// Service, der vom Logger abhängt@injectable()class UserService { constructor(@inject(TYPES.ILogger) private logger: ILogger) {}

createUser(name: string): void { this.logger.log(`Benutzer ${name} erstellt`); }}

// Container-Konfigurationconst container = new Container();container.bind<ILogger>(TYPES.ILogger).to(ConsoleLogger).inSingletonScope();container.bind<UserService>(TYPES.IUserService).to(UserService);

// Verwendungconst userService = container.get<UserService>(TYPES.IUserService);userService.createUser("Alexej");


2. TSyringe



TSyringe ist ein leichtgewichtiger DI-Container von Microsoft. Er verwendet Dekorateure und die automatische Auflösung über den Konstruktor. Ideal für mittlere und kleinere Projekte.



Installation

npm install tsyringe reflect-metadata --save


Die Konfiguration von tsconfig.json ist analog zu InversifyJS.



Anwendungsbeispiel

import { container, injectable, singleton } from "tsyringe";import "reflect-metadata";

// Klasse als Singleton registrieren@singleton()class DatabaseConnection { connect(): void { console.log("Verbindung zur Datenbank hergestellt"); }}

// Klasse mit automatischer Abhängigkeitsinjektion@injectable()class UserRepository { constructor(private db: DatabaseConnection) {}

save(user

Empfehlungen