delete<T> method
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;
}