delete<T> method

bool delete<T>({
  1. String? tag,
  2. bool force = false,
})

Delete a dependency by type and optional tag

Implementation

bool delete<T>({String? tag, bool force = false}) {
  if (_disposed) {
    return false;
  }

  final key = _getDependencyKey(T, tag);
  final factoryKey = _makeKey<T>(tag);

  // Check if permanent
  if (_useCount.containsKey(key)) {
    final permanent = _useCount[key] == -1;
    if (permanent && !force) {
      ZenLogger.logWarning(
          'Attempted to delete permanent dependency of type $T${tag != null ? ' with tag $tag' : ''}. Use force=true to override.');
      return false;
    }
  }

  dynamic instanceToDelete;

  // Check if we have a factory registered
  if (_factories.containsKey(factoryKey)) {
    _factories.remove(factoryKey);
    _useCount.remove(key);
    return true;
  }

  if (tag != null) {
    instanceToDelete = _taggedBindings[tag];
    if (instanceToDelete == null) {
      return false;
    }

    // Remove from tag map
    _taggedBindings.remove(tag);

    // Update type-to-tags tracking using the GENERIC type T, not runtimeType
    _typeToTags[T]?.remove(tag);
    if (_typeToTags[T]?.isEmpty ?? false) {
      _typeToTags.remove(T);
    }
  } else {
    instanceToDelete = _typeBindings[T];
    if (instanceToDelete == null) {
      return false;
    }

    // Remove from type map
    _typeBindings.remove(T);
  }

  // Remove from use count tracking
  _useCount.remove(key);

  // Dispose if it's a controller OR service
  if (instanceToDelete is ZenController && !instanceToDelete.isDisposed) {
    instanceToDelete.dispose();
  } else if (instanceToDelete is ZenService && !instanceToDelete.isDisposed) {
    instanceToDelete.dispose();
  }

  if (ZenConfig.enableDebugLogs) {
    ZenLogger.logDebug(
        'Deleted dependency $T${tag != null ? ' with tag $tag' : ''}');
  }

  return true;
}