@hestjs/core
Version:
HestJS Core Framework - A TypeScript framework built on Hono with dependency injection and decorators
124 lines • 3.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Container = void 0;
require("reflect-metadata");
const tsyringe_1 = require("tsyringe");
const constants_1 = require("../utils/constants");
/**
* HestJS DI 容器封装
*/
class Container {
static instance;
container;
logicalContainer = new Map();
constructor() {
this.container = tsyringe_1.container.createChildContainer();
}
/**
* 获取容器单例
*/
static getInstance() {
if (!Container.instance) {
Container.instance = new Container();
}
return Container.instance;
}
/**
* 注册服务
*/
register(token, provider, type = 'provider') {
const metadata = Reflect.getMetadata(constants_1.METADATA_KEYS.INJECTABLE, provider) || {};
// 保存到逻辑容器
const logicalItem = {
token,
provider,
type,
metadata: this.extractMetadata(provider, type),
scope: metadata.scope
};
this.logicalContainer.set(token, logicalItem);
switch (metadata.scope) {
case constants_1.Scope.SINGLETON:
this.container.registerSingleton(token, provider);
break;
case constants_1.Scope.TRANSIENT:
this.container.register(token, { useClass: provider });
break;
default:
this.container.registerSingleton(token, provider);
}
}
/**
* 注册实例
*/
registerInstance(token, instance) {
this.container.registerInstance(token, instance);
}
/**
* 解析服务
*/
resolve(token) {
return this.container.resolve(token);
}
/**
* 检查是否已注册
*/
isRegistered(token) {
return this.container.isRegistered(token);
}
/**
* 清空容器
*/
clear() {
this.container.clearInstances();
}
/**
* 创建子容器
*/
createChild() {
const child = new Container();
child.container = this.container.createChildContainer();
return child;
}
/**
* 获取底层容器实例
*/
getContainer() {
return this.container;
}
/**
* 获取逻辑容器中的所有项
*/
getLogicalContainer() {
return this.logicalContainer;
}
/**
* 获取指定类型的所有项
*/
getItemsByType(type) {
return Array.from(this.logicalContainer.values()).filter(item => item.type === type);
}
/**
* 获取所有控制器
*/
getAllControllers() {
return this.getItemsByType('controller');
}
/**
* 提取元数据信息
*/
extractMetadata(provider, type) {
switch (type) {
case 'controller':
return Reflect.getMetadata(constants_1.METADATA_KEYS.CONTROLLER, provider);
case 'module':
return Reflect.getMetadata(constants_1.METADATA_KEYS.MODULE, provider);
case 'provider':
return Reflect.getMetadata(constants_1.METADATA_KEYS.INJECTABLE, provider);
default:
return null;
}
}
}
exports.Container = Container;
//# sourceMappingURL=container.js.map