UNPKG

@hestjs/core

Version:

HestJS Core Framework - A TypeScript framework built on Hono with dependency injection and decorators

124 lines 3.34 kB
"use strict"; 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