`DestroyRef.onDestroy`-Callbacks laufen pro Injector in Registrierungsreihenfolge, aber zur Laufzeit dynamisch registrierte Ressourcen — etwa Sockets, die von lazy geladenen Feature-Komponenten geöffnet werden — brauchen einen Teardown in umgekehrter Erwerbsreihenfolge, um nicht eine gemeinsam genutzte Abhängigkeit zu schließen, bevor das Handle, das noch darauf verweist, geschlossen ist. Dieser Pool verfolgt die Einfügereihenfolge in einer `Map` und baut in umgekehrter Reihenfolge ab; das `closing`-Flag schließt alles, was mitten im Teardown registriert wird, sofort, statt es in eine Menge zu legen, die nie wieder durchlaufen wird. Ohne das Flag könnte eine Komponente, die durch ihr eigenes `ngOnDestroy` während der Teardown-Schleife des Pools zerstört wird, ein Handle registrieren, das stillschweigend nie geschlossen wird.
import { Injectable, DestroyRef, inject } from '@angular/core';@Injectable()export class ResourcePool {private handles = new Map<string, { close(): void }>();private closing = false;private destroyRef = inject(DestroyRef);constructor() {this.destroyRef.onDestroy(() => this.teardown());}register(key: string, handle: { close(): void }): void {if (this.closing) {handle.close();return;}this.handles.get(key)?.close();this.handles.set(key, handle);}private teardown(): void {this.closing = true;for (const [key, handle] of [...this.handles].reverse()) {handle.close();this.handles.delete(key);}}}