devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
64 lines (63 loc) • 1.89 kB
JavaScript
/**
* DevExtreme (esm/__internal/core/di/index.js)
* Version: 25.1.3
* Build date: Wed Jun 25 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
export class DIContext {
constructor() {
this.instances = new Map;
this.fabrics = new Map;
this.aliases = new Map;
this.antiRecursionSet = new Set
}
register(id, fabric) {
fabric ?? (fabric = id);
this.fabrics.set(id, fabric)
}
registerInstance(id, instance) {
this.instances.set(id, instance)
}
get(id) {
const instance = this.tryGet(id);
if (instance) {
return instance
}
throw new Error(`DI item is not registered: ${id}`)
}
tryGet(id) {
id = this.resolveAlias(id);
if (this.instances.get(id)) {
return this.instances.get(id)
}
const fabric = this.fabrics.get(id);
if (fabric) {
const res = this.create(fabric);
this.instances.set(id, res);
this.instances.set(fabric, res);
return res
}
return null
}
create(fabric) {
if (this.antiRecursionSet.has(fabric)) {
throw new Error("dependency cycle in DI")
}
this.antiRecursionSet.add(fabric);
const args = fabric.dependencies.map((dependency => this.get(dependency)));
this.antiRecursionSet.delete(fabric);
return new fabric(...args)
}
addAlias(aliasId, id) {
this.aliases.set(aliasId, id)
}
resolveAlias(aliasId) {
let result = aliasId;
while (this.aliases.has(result)) {
result = this.aliases.get(result)
}
return result
}
}