Initial commit
This commit is contained in:
77
remote/src/core/Container.js
Normal file
77
remote/src/core/Container.js
Normal file
@@ -0,0 +1,77 @@
|
||||
class Container {
|
||||
constructor() {
|
||||
this._services = new Map();
|
||||
this._singletons = new Map();
|
||||
this._resolving = new Set();
|
||||
}
|
||||
|
||||
register(name, factory, isSingleton = true) {
|
||||
if (typeof name !== 'string' || name.trim() === '') {
|
||||
throw new Error('Service name must be a non-empty string');
|
||||
}
|
||||
if (typeof factory !== 'function') {
|
||||
throw new Error('Factory must be a function');
|
||||
}
|
||||
if (this._services.has(name)) {
|
||||
throw new Error(`Service "${name}" is already registered`);
|
||||
}
|
||||
|
||||
this._services.set(name, { factory, isSingleton });
|
||||
return this;
|
||||
}
|
||||
|
||||
resolve(name) {
|
||||
if (!this._services.has(name)) {
|
||||
throw new Error(`Service "${name}" is not registered`);
|
||||
}
|
||||
|
||||
if (this._resolving.has(name)) {
|
||||
const chain = Array.from(this._resolving).join(' -> ');
|
||||
throw new Error(
|
||||
`Circular dependency detected: ${chain} -> ${name}. ` +
|
||||
`This creates a circular reference that cannot be resolved.`
|
||||
);
|
||||
}
|
||||
|
||||
const service = this._services.get(name);
|
||||
|
||||
if (service.isSingleton && this._singletons.has(name)) {
|
||||
return this._singletons.get(name);
|
||||
}
|
||||
|
||||
this._resolving.add(name);
|
||||
|
||||
try {
|
||||
const instance = service.factory(this);
|
||||
|
||||
if (service.isSingleton) {
|
||||
this._singletons.set(name, instance);
|
||||
}
|
||||
|
||||
return instance;
|
||||
} finally {
|
||||
this._resolving.delete(name);
|
||||
}
|
||||
}
|
||||
|
||||
has(name) {
|
||||
return this._services.has(name);
|
||||
}
|
||||
|
||||
unregister(name) {
|
||||
if (!this._services.has(name)) {
|
||||
return false;
|
||||
}
|
||||
this._services.delete(name);
|
||||
this._singletons.delete(name);
|
||||
return true;
|
||||
}
|
||||
|
||||
clear() {
|
||||
this._services.clear();
|
||||
this._singletons.clear();
|
||||
this._resolving.clear();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Container;
|
||||
Reference in New Issue
Block a user