typescript / intermediate
Snippet
Erstellen eines leichtgewichtigen Dependency-Injection-Containers
Dependency Injection (DI) ist ein zentrales Entwurfsmuster in modernen Anwendungssystemen. Unter Verwendung von Generics und Symbols in TypeScript lässt sich ein typsicherer DI-Container erstellen, der eindeutige Token Instanzen zuordnet, ohne auf externe Dekoratoren oder Reflexion angewiesen zu sein.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type Token<T> = { readonly id: symbol };function createToken<T>(description: string): Token<T> {return { id: Symbol(description) };}class ServiceContainer {private services = new Map<symbol, unknown>();register<T>(token: Token<T>, instance: T): void {this.services.set(token.id, instance);}resolve<T>(token: Token<T>): T {const service = this.services.get(token.id);if (!service) {throw new Error(`Service not registered for token: ${token.id.toString()}`);}return service as T;}}interface Logger {log(msg: string): void;}const LoggerToken = createToken<Logger>("Logger");const container = new ServiceContainer();container.register(LoggerToken, { log: (msg) => console.log(msg) });const logger = container.resolve(LoggerToken);logger.log("DI Container initialized");
Erklärung
1
type Token<T> = { readonly id: symbol };
Definiert ein typsicheres Token, das ein generisches Phantomsystem zur Typerhaltung nutzt.
2
class ServiceContainer {
Kapselt die Registrierungs- und Aufrufmechanismen der Abhängigkeiten.
3
register<T>(token: Token<T>, instance: T): void
Verknüpft eine konkrete Dienst-Implementierung mit ihrem typsicheren Token.
4
resolve<T>(token: Token<T>): T
Löst die registrierte Abhängigkeit auf und stellt die vollständige Typsicherheit wieder her.