@glimmer/di
Version:
Dependency injection support for Glimmer applications.
78 lines • 2.71 kB
JavaScript
export default class Registry {
constructor(options) {
this._registrations = {};
this._registeredOptions = {};
this._registeredInjections = {};
if (options && options.fallback) {
this._fallback = options.fallback;
}
}
register(specifier, factoryDefinition, options) {
this._registrations[specifier] = factoryDefinition;
if (options) {
this._registeredOptions[specifier] = options;
}
}
registration(specifier) {
let registration = this._registrations[specifier];
if (registration === undefined && this._fallback) {
registration = this._fallback.registration(specifier);
}
return registration;
}
unregister(specifier) {
delete this._registrations[specifier];
delete this._registeredOptions[specifier];
delete this._registeredInjections[specifier];
}
registerOption(specifier, option, value) {
let options = this._registeredOptions[specifier];
if (!options) {
options = {};
this._registeredOptions[specifier] = options;
}
options[option] = value;
}
registeredOption(specifier, option) {
let result;
let options = this.registeredOptions(specifier);
if (options) {
result = options[option];
}
if (result === undefined && this._fallback !== undefined) {
result = this._fallback.registeredOption(specifier, option);
}
return result;
}
registeredOptions(specifier) {
let options = this._registeredOptions[specifier];
if (options === undefined) {
let type = specifier.split(':')[0];
options = this._registeredOptions[type];
}
return options;
}
unregisterOption(specifier, option) {
let options = this._registeredOptions[specifier];
if (options) {
delete options[option];
}
}
registerInjection(specifier, property, source) {
let injections = this._registeredInjections[specifier];
if (injections === undefined) {
this._registeredInjections[specifier] = injections = [];
}
injections.push({
property,
source
});
}
registeredInjections(specifier) {
let type = specifier.split(':')[0];
let injections = this._fallback ? this._fallback.registeredInjections(specifier) : [];
Array.prototype.push.apply(injections, this._registeredInjections[type]);
Array.prototype.push.apply(injections, this._registeredInjections[specifier]);
return injections;
}
}