0 Tage Serie
javascript / intermediate
Snippet

Dependency Inversion mittels abstrakter Service-Tokens in Angular-Providern

Durch die Verwendung abstrakter Klassen als Dependency-Injection-Tokens ermöglicht Angular Komponenten, von einer abstrakten Schnittstelle abzuhängen, während die konkrete Implementierung im Provider dynamisch ausgetauscht werden kann. Dies setzt das Dependency-Inversion-Prinzip (DIP) der OOP um.

snippet.js
javascript
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
32
import { Injectable, Provider } from '@angular/core';
export abstract class StorageService {
abstract getItem(key: string): string | null;
abstract setItem(key: string, value: string): void;
}
@Injectable()
export class LocalStorageService extends StorageService {
getItem(key: string): string | null {
return localStorage.getItem(key);
}
setItem(key: string, value: string): void {
localStorage.setItem(key, value);
}
}
@Injectable()
export class MemoryStorageService extends StorageService {
private store = new Map<string, string>();
getItem(key: string): string | null {
return this.store.get(key) ?? null;
}
setItem(key: string, value: string): void {
this.store.set(key, value);
}
}
export const provideStorage = (useMemory = false): Provider => ({
provide: StorageService,
useClass: useMemory ? MemoryStorageService : LocalStorageService
});
angular
Erklärung
1
export abstract class StorageService {
Definiert eine abstrakte Basisklasse, die gleichzeitig als TypeScript-Interface und Laufzeit-Injection-Token fungiert.
2
export class MemoryStorageService extends StorageService {
Implementiert eine speicherbasierte polymorphe Variante des abstrakten Storage-Vertrags.
3
useClass: useMemory ? MemoryStorageService : LocalStorageService
Wählt abhängig von Konfigurations- oder Testflags dynamisch die konkrete Klasse für das abstrakte Token aus.