injection-js
Version:
Dependency Injection library for JavaScript and TypeScript
80 lines • 2.15 kB
JavaScript
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { stringify } from './facade/lang';
import { resolveForwardRef } from './forward_ref';
/**
* A unique object used for retrieving items from the {@link ReflectiveInjector}.
*
* Keys have:
* - a system-wide unique `id`.
* - a `token`.
*
* `Key` is used internally by {@link ReflectiveInjector} because its system-wide unique `id` allows
* the
* injector to store created objects in a more efficient way.
*
* `Key` should not be created directly. {@link ReflectiveInjector} creates keys automatically when
* resolving
* providers.
* @experimental
*/
export class ReflectiveKey {
/**
* Private
*/
constructor(token, id) {
this.token = token;
this.id = id;
if (!token) {
throw new Error('Token must be defined!');
}
}
/**
* Returns a stringified token.
*/
get displayName() {
return stringify(this.token);
}
/**
* Retrieves a `Key` for a token.
*/
static get(token) {
// tslint:disable-next-line:no-use-before-declare
return _globalKeyRegistry.get(resolveForwardRef(token));
}
/**
* @returns the number of keys registered in the system.
*/
static get numberOfKeys() {
// tslint:disable-next-line:no-use-before-declare
return _globalKeyRegistry.numberOfKeys;
}
}
/**
* @internal
*/
export class KeyRegistry {
constructor() {
this._allKeys = new Map();
}
get(token) {
if (token instanceof ReflectiveKey)
return token;
if (this._allKeys.has(token)) {
return this._allKeys.get(token);
}
const newKey = new ReflectiveKey(token, ReflectiveKey.numberOfKeys);
this._allKeys.set(token, newKey);
return newKey;
}
get numberOfKeys() {
return this._allKeys.size;
}
}
const _globalKeyRegistry = new KeyRegistry();
//# sourceMappingURL=reflective_key.js.map