InversifyJS: Leistungsstarker IoC-Container für TypeScript
\n\nInversifyJS 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\nInversifyJS 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\nGrundlegende Konzepte von InversifyJS
\n\nBevor 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
Installation und Konfiguration
\n\nInstallieren Sie zunächst InversifyJS und seine typografischen Abhängigkeiten:
\n\nnpm install inversify reflect-metadata --save\nnpm install --save-dev @types/node\n\nFügen Sie dann in tsconfig.json zwei obligatorische Optionen hinzu:
{\n "compilerOptions": {\n "emitDecoratorMetadata": true,\n "experimentalDecorators": true,\n "types": ["reflect-metadata"]\n }\n}\n\nImportieren Sie anschließend reflect-metadata in der Hauptdatei der Anwendung (normalerweise index.ts oder main.ts):
import "reflect-metadata";\n\nErstes Beispiel: Ein einfacher Service
\n\nErstellen wir ein Interface und seine Implementierung. Beachten Sie den Dekorateur @injectable():
// 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\nRegistrieren wir nun diese Verbindung im Container und holen eine Instanz:
\n\nimport { 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\nAbhängigkeitsinjektion über den Konstruktor
\n\nDie wahre Stärke von DI zeigt sich, wenn eine Klasse von einer anderen abhängt. Verwenden Sie den Dekorateur @inject():
// 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\nRegistrier
Auch in der Bibliothek
Axios für JavaScript (Node.js): Vollständiger Leitfaden mit Beispielen
HikariCP Java: Vollständige Anleitung mit Beispielen
Redis-Client für C++: Verbindung, Installation und Anwendungsbeispiele
Polly für C# (.NET): Komplettleitfaden mit Beispielen
Arbeiten mit XML in Java: DOM, SAX, StAX und JAXB – vollständiger Leitfaden