tsyringe TypeScript: Komplettes Tutorial mit Beispielen

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

tsyringe für TypeScript: Komplettes Tutorial mit Beispielen

In der modernen TypeScript-Entwicklung ist die Abhängigkeitsverwaltung eine zentrale Herausforderung, insbesondere beim Bau skalierbarer und testbarer Anwendungen. Die Bibliothek tsyringe ist ein leichter und leistungsstarker Dependency-Injection-Container (DI), der vollständig auf TypeScript-Dekorateuren basiert. Sie ermöglicht es Entwicklern, Abhängigkeiten zwischen Komponenten deklarativ zu beschreiben, automatisch aufzulösen und den Lebenszyklus von Objekten zu verwalten.

Warum braucht man tsyringe? In großen Projekten führt das manuelle Erstellen von Klasseninstanzen und deren Übergabe an Konstruktoren zu stark gekoppeltem Code, erschwert das Testen und macht es schwierig, Implementierungen auszutauschen. tsyringe löst diese Probleme, indem es eine zentrale Registrierungsstelle (Container) bereitstellt, die weiß, wie Abhängigkeiten erstellt und bereitgestellt werden. Sie geben einfach an, welche Klassen oder Token registriert werden sollen, und der Container injiziert sie automatisch dort, wo sie benötigt werden. Das macht den Code sauberer, modularer und vereinfacht das Schreiben von Unit-Tests erheblich.

Die Bibliothek nutzt intensiv TypeScript-Dekorateure (@injectable(), @inject()), was die Syntax für Entwickler, die mit Angular oder NestJS vertraut sind, intuitiv macht. tsyringe erfordert keine komplexe Konfiguration, funktioniert "out of the box" mit modernen TypeScript-Versionen und unterstützt verschiedene Registrierungsstrategien (Singleton, Transient, Scoped). In diesem Artikel werden wir alle Aspekte der Arbeit mit tsyringe im Detail behandeln, von der Installation bis zu komplexen Anwendungsszenarien.

Installation

Um tsyringe in Ihr TypeScript-Projekt zu installieren, führen Sie den folgenden Befehl mit npm aus:

npm install tsyringe reflect-metadata

Nach der Installation müssen Sie sicherstellen, dass die Unterstützung für Dekorateure in Ihrem Projekt aktiviert ist. Fügen Sie dazu in Ihrer tsconfig.json-Datei die folgenden Optionen hinzu:

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

Außerdem müssen Sie im Einstiegspunkt Ihrer Anwendung (z. B. index.ts) einmalig reflect-metadata importieren, um die Metadaten für die Dekorateure zu aktivieren:

import "reflect-metadata";
// ... restlicher Code

Schnellstart: Minimales funktionierendes Beispiel

Lassen Sie uns eine einfache Anwendung erstellen, die die grundlegende Funktionsweise von tsyringe demonstriert. Wir haben einen Dienst für die Datenbankarbeit, der in einen Controller injiziert wird.

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

// 1. Dienst definieren, der injiziert wird
@injectable()
class DatabaseService {
  getData(): string {
    return "Daten aus der Datenbank";
  }
}

// 2. Controller definieren, der von DatabaseService abhängt
@injectable()
class UserController {
  constructor(
    @inject(DatabaseService) private dbService: DatabaseService
  ) {}

  getUserData(): string {
    return this.dbService.getData();
  }
}

// 3. Klassen im Container registrieren (in diesem Fall nicht zwingend erforderlich,
//    da tsyringe registrierte Klassen automatisch auflösen kann)
container.registerSingleton(DatabaseService);
container.registerSingleton(UserController);

// 4. Container verwenden, um eine Instanz des Controllers zu erhalten
const controller = container.resolve(UserController);
console.log(controller.getUserData()); // Ausgabe: "Daten aus der Datenbank"

Dieses Beispiel zeigt drei wichtige Schritte: Markieren einer Klasse mit @injectable(), Angabe der Abhängigkeiten über @inject() im Konstruktor und Abrufen einer Instanz über container.resolve(). Beachten Sie, dass wenn eine Klasse mit dem Dekorateur @injectable() markiert ist, tsyringe sie automatisch registrieren kann – eine explizite Registrierung ist nur für bestimmte Szenarien wie die Verwendung von Token oder die Änderung der Lebenszyklusstrategie erforderlich.

Empfehlungen