dispose method

  1. @mustCallSuper
void dispose()

Dispose this scope and all its dependencies

Implementation

@mustCallSuper
void dispose() {
  if (_disposed) {
    return;
  }

  ZenLogger.logDebug('Disposing scope: $name');

  // Run all registered disposers
  for (final disposer in _disposers) {
    try {
      disposer();
    } catch (e) {
      ZenLogger.logWarning('Error executing disposer in scope $name: $e');
    }
  }

  // Dispose all controllers AND services
  for (final dep in _typeBindings.values) {
    if (dep is ZenController && !dep.isDisposed) {
      dep.dispose();
    }
    // 🆕 Add ZenService disposal
    else if (dep is ZenService && !dep.isDisposed) {
      dep.dispose();
    }
  }

  for (final dep in _taggedBindings.values) {
    if (dep is ZenController && !dep.isDisposed) {
      dep.dispose();
    }
    // 🆕 Add ZenService disposal
    else if (dep is ZenService && !dep.isDisposed) {
      dep.dispose();
    }
  }

  // Dispose child scopes
  final childrenToDispose = List.from(_childScopes);
  for (final child in childrenToDispose) {
    child.dispose();
  }

  // Clear all collections
  _typeBindings.clear();
  _taggedBindings.clear();
  _typeToTags.clear();
  _factories.clear();
  _childScopes.clear();
  _useCount.clear();
  _disposers.clear();

  // Remove this scope from parent's children
  parent?._childScopes.remove(this);

  _disposed = true;
}