bindExisting<Alias, Concrete extends Alias> method
Binds Alias to an existing local singleton registration of Concrete.
The alias is non-owning: resolving it returns the canonical instance, deleting it does not dispose that instance, and disposing the canonical registration removes all of its aliases before disposing it once.
Aliases are intentionally local and cannot target factory registrations.
Implementation
void bindExisting<Alias, Concrete extends Alias>({
String? sourceTag,
String? tag,
}) {
_ensureUsable();
final aliasKey = _getKey<Alias>(tag);
final canonicalKey = _getKey<Concrete>(sourceTag);
final canonical = _registry[canonicalKey];
if (canonical == null) {
throw StateError(
'LevitScope($name): Cannot bind alias "${aliasKey.debugString}" '
'because local source "${canonicalKey.debugString}" is not registered.',
);
}
if (canonical.isFactory) {
throw StateError(
'LevitScope($name): Factory registration '
'"${canonicalKey.debugString}" cannot be aliased.',
);
}
if (aliasKey == canonicalKey) {
throw ArgumentError(
'Alias and canonical registration must use different keys.',
);
}
if (_registry.containsKey(aliasKey) || _aliases.containsKey(aliasKey)) {
throw StateError(
'LevitScope($name): Alias key "${aliasKey.debugString}" is already '
'registered.',
);
}
_aliases[aliasKey] = canonicalKey;
(_aliasesByCanonical[canonicalKey] ??= <LevitScopeKey>{}).add(aliasKey);
_invalidateLookupCaches(aliasKey);
_notifyRegister(aliasKey.debugString, canonical, 'bindExisting');
}