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.