InversifyJS: IoC-Container für TypeScript-Anwendungen

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

InversifyJS: Leistungsstarker IoC-Container für TypeScript

\n\n

InversifyJS ist ein leichtgewichtiger, aber äußerst leistungsstarker IoC (Inversion of Control) Container für TypeScript- und JavaScript-Anwendungen. Er implementiert das Dependency Injection (DI)-Muster und ermöglicht es Entwicklern, lose gekoppelte, testbare und skalierbare Systeme zu erstellen. Die Bibliothek nutzt die Möglichkeiten von TypeScript (Dekorateure, Typen) aktiv, um strenge Typisierung und Entwicklungskomfort zu gewährleisten.

\n\n

InversifyJS eignet sich ideal für serverseitige Anwendungen mit Node.js sowie für clientseitige Projekte mit Frameworks wie Angular, React oder Vue. In dieser Übersicht werden wir die wichtigsten Konzepte erläutern und zeigen, wie Sie schnell loslegen können.

\n\n

Grundlegende Konzepte von InversifyJS

\n\n

Bevor Sie Code schreiben, ist es wichtig, die drei Hauptentitäten der Bibliothek zu verstehen:

\n\n
    \n
  • Container – das zentrale Objekt, das alle Abhängigkeiten verwaltet. Sie registrieren darin Abstraktionen und deren Implementierungen.
  • \n
  • Service-Identifikatoren – eindeutige Schlüssel, anhand derer der Container die benötigte Implementierung findet. Es können Strings, Symbole oder Klassen sein.
  • \n
  • Dekorateure – @injectable() und @inject() – teilen TypeScript mit, dass eine Klasse injiziert werden kann und welche Abhängigkeiten sie benötigt.
  • \n
\n\n

Installation und Konfiguration

\n\n

Installieren Sie zunächst InversifyJS und seine typografischen Abhängigkeiten:

\n\n
npm install inversify reflect-metadata --save\nnpm install --save-dev @types/node
\n\n

Fügen Sie dann in tsconfig.json zwei obligatorische Optionen hinzu:

\n\n
{\n  "compilerOptions": {\n    "emitDecoratorMetadata": true,\n    "experimentalDecorators": true,\n    "types": ["reflect-metadata"]\n  }\n}
\n\n

Importieren Sie anschließend reflect-metadata in der Hauptdatei der Anwendung (normalerweise index.ts oder main.ts):

\n\n
import "reflect-metadata";
\n\n

Erstes Beispiel: Ein einfacher Service

\n\n

Erstellen wir ein Interface und seine Implementierung. Beachten Sie den Dekorateur @injectable():

\n\n
// interfaces/IWarrior.ts\nexport interface IWarrior {\n    fight(): string;\n}\n\n// entities/Warrior.ts\nimport { injectable } from "inversify";\n\n@injectable()\nexport class Warrior implements IWarrior {\n    fight(): string {\n        return "Warrior attacks with sword!";\n    }\n}
\n\n

Registrieren wir nun diese Verbindung im Container und holen eine Instanz:

\n\n
import { Container } from "inversify";\nimport { IWarrior } from "./interfaces/IWarrior";\nimport { Warrior } from "./entities/Warrior";\n\nconst container = new Container();\n\n// Registrieren der Abstraktion mit ihrer Implementierung\ncontainer.bind<IWarrior>("IWarrior").to(Warrior);\n\n// Instanz holen\nconst warrior = container.get<IWarrior>("IWarrior");\nconsole.log(warrior.fight()); // "Warrior attacks with sword!"
\n\n

Abhängigkeitsinjektion über den Konstruktor

\n\n

Die wahre Stärke von DI zeigt sich, wenn eine Klasse von einer anderen abhängt. Verwenden Sie den Dekorateur @inject():

\n\n
// interfaces/IWeapon.ts\nexport interface IWeapon {\n    use(): string;\n}\n\n// entities/Sword.ts\nimport { injectable } from "inversify";\n\n@injectable()\nexport class Sword implements IWeapon {\n    use(): string {\n        return "Swing sword!";\n    }\n}\n\n// entities/Knight.ts\nimport { injectable, inject } from "inversify";\nimport { IWarrior } from "../interfaces/IWarrior";\nimport { IWeapon } from "../interfaces/IWeapon";\n\n@injectable()\nexport class Knight implements IWarrior {\n    private _weapon: IWeapon;\n\n    constructor(@inject("IWeapon") weapon: IWeapon) {\n        this._weapon = weapon;\n    }\n\n    fight(): string {\n        return this._weapon.use() + " The knight fights!";\n    }\n}
\n\n

Registrier

Empfehlungen