light-di 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +112 -0
  3. package/dist/TypeDI/BaseServiceImpl.d.ts +14 -0
  4. package/dist/TypeDI/BaseServiceImpl.d.ts.map +1 -0
  5. package/dist/TypeDI/BaseServiceImpl.js +32 -0
  6. package/dist/TypeDI/BaseServiceImpl.js.map +1 -0
  7. package/dist/TypeDI/ITypeDIBaseService.d.ts +7 -0
  8. package/dist/TypeDI/ITypeDIBaseService.d.ts.map +1 -0
  9. package/dist/TypeDI/ITypeDIBaseService.js +11 -0
  10. package/dist/TypeDI/ITypeDIBaseService.js.map +1 -0
  11. package/dist/TypeDI/ITypeDIManager.d.ts +29 -0
  12. package/dist/TypeDI/ITypeDIManager.d.ts.map +1 -0
  13. package/dist/TypeDI/ITypeDIManager.js +3 -0
  14. package/dist/TypeDI/ITypeDIManager.js.map +1 -0
  15. package/dist/TypeDI/ServiceToken.d.ts +64 -0
  16. package/dist/TypeDI/ServiceToken.d.ts.map +1 -0
  17. package/dist/TypeDI/ServiceToken.js +125 -0
  18. package/dist/TypeDI/ServiceToken.js.map +1 -0
  19. package/dist/TypeDI/TypeDIManager.d.ts +60 -0
  20. package/dist/TypeDI/TypeDIManager.d.ts.map +1 -0
  21. package/dist/TypeDI/TypeDIManager.js +154 -0
  22. package/dist/TypeDI/TypeDIManager.js.map +1 -0
  23. package/dist/TypeDI/getServiceByType.d.ts +21 -0
  24. package/dist/TypeDI/getServiceByType.d.ts.map +1 -0
  25. package/dist/TypeDI/getServiceByType.js +30 -0
  26. package/dist/TypeDI/getServiceByType.js.map +1 -0
  27. package/dist/TypeDI/index.d.ts +29 -0
  28. package/dist/TypeDI/index.d.ts.map +1 -0
  29. package/dist/TypeDI/index.js +29 -0
  30. package/dist/TypeDI/index.js.map +1 -0
  31. package/dist/src/index.d.ts +12 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/index.js +31 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/package.json +52 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # LightDI - TypeScript 依赖注入框架
2
+
3
+ ## 安装
4
+
5
+ ```bash
6
+ npm install light-di reflect-metadata
7
+ ```
8
+
9
+ **注意**:需要安装 `reflect-metadata` 作为 peer dependency。
10
+
11
+ ## 设计理念
12
+
13
+ LightDI 旨在实现服务之间的解耦:**服务之间只通过接口依赖,无需关注具体实现**。通过依赖注入,可以轻松替换实现类,提高代码的可维护性和可测试性。
14
+
15
+ ## 核心功能
16
+
17
+ ### 1. 初始化
18
+ 应用启动时调用一次 `TypeDIManager.init()` 初始化单例。
19
+
20
+ ### 2. 绑定和获取服务
21
+ - `bind<IxxxService>(instance, key?)` - 绑定服务实例
22
+ - `getService(InterfaceClass, key?)` - 获取服务实例
23
+
24
+ **key 的作用**:用于实现一个接口有多个实例的场景。同一个接口可以通过不同的 key 绑定多个实例,默认 key 为 `default`。
25
+
26
+ ### 3. ManagerProvider 自动创建
27
+ 如果 `getService` 找不到实例,会自动调用实现类的 `ManagerProvider()` 方法创建实例并缓存,**无需手动 new 实现类**。
28
+
29
+ ## 使用要求
30
+
31
+ ### 接口文件 (IxxxService.ts)
32
+ - 继承 `ITypeDIBaseService`
33
+ - 使用 `@ServiceInterface()` 装饰器
34
+ - 只包含接口定义
35
+
36
+ ### 实现文件 (xxxImpl.ts)
37
+ - 实现接口
38
+ - 使用 `@ServiceImpl(InterfaceClass)` 装饰器
39
+ - `ManagerProvider()` 方法由装饰器自动创建
40
+
41
+ ## 示例
42
+
43
+ ### 定义服务
44
+
45
+ **接口定义 (IBizA.ts)**
46
+ ```typescript
47
+ import { ITypeDIBaseService, ServiceInterface } from 'light-di';
48
+
49
+ @ServiceInterface()
50
+ export abstract class IBizA extends ITypeDIBaseService {
51
+ abstract value: number;
52
+ abstract print(): void;
53
+ }
54
+ ```
55
+
56
+ **实现定义 (BizAImpl.ts)**
57
+ ```typescript
58
+ import { IBizA } from './IBizA';
59
+ import { ServiceImpl } from 'light-di';
60
+
61
+ @ServiceImpl(IBizA)
62
+ export class BizAImpl implements IBizA {
63
+ public value: number = 10;
64
+ public print(): void {
65
+ console.log('BizA:', this.value);
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### 基本使用
71
+
72
+ ```typescript
73
+ import 'reflect-metadata';
74
+ import { TypeDIManager, bind, getService } from 'light-di';
75
+ import { IBizA } from './IBizA';
76
+
77
+ // 初始化(应用启动时调用一次)
78
+ TypeDIManager.init();
79
+
80
+ // 方式1: 手动绑定实例
81
+ bind<IBizA>(new BizAImpl());
82
+
83
+ // 方式2: 自动创建(无需手动 new)
84
+ // 直接获取服务,如果未绑定会自动调用 ManagerProvider() 创建实例
85
+ const bizA = getService(IBizA); // 自动创建 BizAImpl 实例
86
+
87
+ // 多实例绑定(使用不同的 key)
88
+ bind<IBizA>(new BizAImpl(), 'key1');
89
+ const bizAWithKey1 = getService(IBizA, 'key1'); // 获取 key1 对应的实例
90
+ const bizADefault = getService(IBizA); // 获取 default key 对应的实例
91
+ ```
92
+
93
+ ### 服务依赖示例
94
+
95
+ ```typescript
96
+ import { ServiceImpl, getService } from 'light-di';
97
+ import { IBizA } from './IBizA';
98
+ import { IBizB } from './IBizB';
99
+
100
+ // BizB 依赖 IBizA,但只需要依赖接口,无需知道具体实现
101
+ @ServiceImpl(IBizB)
102
+ export class BizBImpl implements IBizB {
103
+ private bizA: IBizA;
104
+
105
+ constructor() {
106
+ // 通过接口获取依赖,实现解耦
107
+ this.bizA = getService(IBizA);
108
+ }
109
+ }
110
+ ```
111
+
112
+ 详细示例见 `index.ts` 和 `example/` 目录。
@@ -0,0 +1,14 @@
1
+ import 'reflect-metadata';
2
+ import { ITypeDIBaseService } from './ITypeDIBaseService';
3
+ /**
4
+ * 服务实现装饰器
5
+ * 自动设置 TypeDI 相关的静态属性和方法
6
+ *
7
+ * 使用方式:
8
+ * @ServiceImpl(IBizA)
9
+ * export class BizAImpl implements IBizA {
10
+ * // 实现接口方法
11
+ * }
12
+ */
13
+ export declare function ServiceImpl<T extends ITypeDIBaseService>(interfaceClass: abstract new () => T): <U extends new () => T>(target: U) => U;
14
+ //# sourceMappingURL=BaseServiceImpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseServiceImpl.d.ts","sourceRoot":"","sources":["../../TypeDI/BaseServiceImpl.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,kBAAkB,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,IAC3E,CAAC,SAAS,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAG,CAAC,CAiBtD"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceImpl = ServiceImpl;
4
+ require("reflect-metadata");
5
+ const ServiceToken_1 = require("./ServiceToken");
6
+ /**
7
+ * 服务实现装饰器
8
+ * 自动设置 TypeDI 相关的静态属性和方法
9
+ *
10
+ * 使用方式:
11
+ * @ServiceImpl(IBizA)
12
+ * export class BizAImpl implements IBizA {
13
+ * // 实现接口方法
14
+ * }
15
+ */
16
+ function ServiceImpl(interfaceClass) {
17
+ return function (target) {
18
+ // 应用 Service 装饰器(建立接口到实现的映射)
19
+ (0, ServiceToken_1.Service)(interfaceClass)(target);
20
+ // 设置静态属性
21
+ target.__interface__ = interfaceClass;
22
+ target.__self__ = interfaceClass;
23
+ // 设置 ManagerProvider 方法(如果不存在)
24
+ if (!target.ManagerProvider) {
25
+ target.ManagerProvider = function () {
26
+ return new target();
27
+ };
28
+ }
29
+ return target;
30
+ };
31
+ }
32
+ //# sourceMappingURL=BaseServiceImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseServiceImpl.js","sourceRoot":"","sources":["../../TypeDI/BaseServiceImpl.ts"],"names":[],"mappings":";;AAcA,kCAkBC;AAhCD,4BAA0B;AAE1B,iDAAyC;AAEzC;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAA+B,cAAoC;IAC5F,OAAO,UAAiC,MAAS;QAC/C,6BAA6B;QAC7B,IAAA,sBAAO,EAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;QAEhC,SAAS;QACR,MAAc,CAAC,aAAa,GAAG,cAAc,CAAC;QAC9C,MAAc,CAAC,QAAQ,GAAG,cAAc,CAAC;QAE1C,+BAA+B;QAC/B,IAAI,CAAE,MAAc,CAAC,eAAe,EAAE,CAAC;YACpC,MAAc,CAAC,eAAe,GAAG;gBAChC,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * TypeDI 基础服务抽象类
3
+ * 所有服务接口都应该继承此类
4
+ */
5
+ export declare abstract class ITypeDIBaseService {
6
+ }
7
+ //# sourceMappingURL=ITypeDIBaseService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITypeDIBaseService.d.ts","sourceRoot":"","sources":["../../TypeDI/ITypeDIBaseService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,8BAAsB,kBAAkB;CAGvC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ITypeDIBaseService = void 0;
4
+ /**
5
+ * TypeDI 基础服务抽象类
6
+ * 所有服务接口都应该继承此类
7
+ */
8
+ class ITypeDIBaseService {
9
+ }
10
+ exports.ITypeDIBaseService = ITypeDIBaseService;
11
+ //# sourceMappingURL=ITypeDIBaseService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITypeDIBaseService.js","sourceRoot":"","sources":["../../TypeDI/ITypeDIBaseService.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAsB,kBAAkB;CAGvC;AAHD,gDAGC"}
@@ -0,0 +1,29 @@
1
+ import { ITypeDIBaseService } from './ITypeDIBaseService';
2
+ /**
3
+ * TypeDI 管理器接口
4
+ */
5
+ export interface ITypeDIManager {
6
+ /**
7
+ * 绑定服务实例
8
+ * @param instance 服务实例
9
+ * @param key 可选的服务键,默认为 'default'
10
+ */
11
+ bind<T extends ITypeDIBaseService>(instance: T, key?: string): void;
12
+ /**
13
+ * 获取服务实例
14
+ * @param InterfaceClass 接口类
15
+ * @param key 可选的服务键,默认为 'default'
16
+ */
17
+ getService<T extends ITypeDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
18
+ /**
19
+ * 获取服务实例(通过接口名称)
20
+ * @param interfaceName 接口名称
21
+ * @param key 可选的服务键,默认为 'default'
22
+ */
23
+ getService<T extends ITypeDIBaseService>(interfaceName: string, key?: string): T;
24
+ /**
25
+ * 清除所有服务实例(主要用于测试)
26
+ */
27
+ clear(): void;
28
+ }
29
+ //# sourceMappingURL=ITypeDIManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITypeDIManager.d.ts","sourceRoot":"","sources":["../../TypeDI/ITypeDIManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpE;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,kBAAkB,EACrC,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAAC;IAEL;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,kBAAkB,EACrC,aAAa,EAAE,MAAM,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAAC;IAEL;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ITypeDIManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITypeDIManager.js","sourceRoot":"","sources":["../../TypeDI/ITypeDIManager.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import 'reflect-metadata';
2
+ /**
3
+ * 服务 Token,用于标识服务类型
4
+ */
5
+ export declare class ServiceToken<T extends any> {
6
+ readonly interfaceClass: Function;
7
+ private static tokenMap;
8
+ private constructor();
9
+ /**
10
+ * 创建或获取服务 Token
11
+ * @param interfaceClass 接口类
12
+ * @returns ServiceToken 实例
13
+ */
14
+ static create<T>(interfaceClass: abstract new () => T): ServiceToken<T>;
15
+ /**
16
+ * 从接口类获取 Token
17
+ */
18
+ static from<T>(interfaceClass: abstract new () => T): ServiceToken<T>;
19
+ }
20
+ /**
21
+ * 全局服务注册表,用于存储接口类
22
+ * 通过接口类的名称来查找(用于支持 getService<IxxxService>(key) 调用)
23
+ */
24
+ export declare class ServiceRegistry {
25
+ private static registry;
26
+ private static classToName;
27
+ /**
28
+ * 注册接口类
29
+ */
30
+ static register<T>(interfaceClass: abstract new () => T, name?: string): void;
31
+ /**
32
+ * 通过名称获取接口类
33
+ */
34
+ static getByName(name: string): Function | undefined;
35
+ /**
36
+ * 获取接口类的名称
37
+ */
38
+ static getName(interfaceClass: Function): string | undefined;
39
+ }
40
+ /**
41
+ * 服务接口装饰器
42
+ * 用于标记接口类,使其可以通过名称查找
43
+ * 使用方式: @ServiceInterface() class IBizA extends ITypeDIBaseService { ... }
44
+ */
45
+ export declare function ServiceInterface(name?: string): <T extends abstract new () => any>(target: T) => T;
46
+ /**
47
+ * 获取服务接口类(用于内部实现)
48
+ */
49
+ export declare function getServiceInterfaceByName(name: string): Function | undefined;
50
+ /**
51
+ * 服务装饰器
52
+ * 用于标记实现类对应的接口
53
+ * 使用方式: @Service(IBizA)
54
+ */
55
+ export declare function Service<T extends any>(interfaceClass: abstract new () => T): (target: new () => T) => void;
56
+ /**
57
+ * 获取接口类对应的实现类
58
+ */
59
+ export declare function getImplementationClass(interfaceClass: Function): Function | undefined;
60
+ /**
61
+ * 获取实现类对应的接口类
62
+ */
63
+ export declare function getServiceInterface(target: Function): Function | undefined;
64
+ //# sourceMappingURL=ServiceToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceToken.d.ts","sourceRoot":"","sources":["../../TypeDI/ServiceToken.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,GAAG;aAGD,cAAc,EAAE,QAAQ;IAF5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+C;IAEtE,OAAO;IAIP;;;;OAIG;WACW,MAAM,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAO9E;;OAEG;WACW,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;CAG7E;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,MAAM,CAAC,WAAW,CAA4C;IAEtE;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAM7E;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIpD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS;CAG7D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,IAC3B,CAAC,SAAS,QAAQ,WAAW,GAAG,EAAE,QAAQ,CAAC,KAAG,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE5E;AAYD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,IACxD,QAAQ,UAAU,CAAC,UAUrC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAErF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAS1E"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceRegistry = exports.ServiceToken = void 0;
4
+ exports.ServiceInterface = ServiceInterface;
5
+ exports.getServiceInterfaceByName = getServiceInterfaceByName;
6
+ exports.Service = Service;
7
+ exports.getImplementationClass = getImplementationClass;
8
+ exports.getServiceInterface = getServiceInterface;
9
+ require("reflect-metadata");
10
+ /**
11
+ * 服务 Token,用于标识服务类型
12
+ */
13
+ class ServiceToken {
14
+ constructor(interfaceClass) {
15
+ this.interfaceClass = interfaceClass;
16
+ ServiceToken.tokenMap.set(interfaceClass, this);
17
+ }
18
+ /**
19
+ * 创建或获取服务 Token
20
+ * @param interfaceClass 接口类
21
+ * @returns ServiceToken 实例
22
+ */
23
+ static create(interfaceClass) {
24
+ if (ServiceToken.tokenMap.has(interfaceClass)) {
25
+ return ServiceToken.tokenMap.get(interfaceClass);
26
+ }
27
+ return new ServiceToken(interfaceClass);
28
+ }
29
+ /**
30
+ * 从接口类获取 Token
31
+ */
32
+ static from(interfaceClass) {
33
+ return ServiceToken.create(interfaceClass);
34
+ }
35
+ }
36
+ exports.ServiceToken = ServiceToken;
37
+ ServiceToken.tokenMap = new Map();
38
+ /**
39
+ * 全局服务注册表,用于存储接口类
40
+ * 通过接口类的名称来查找(用于支持 getService<IxxxService>(key) 调用)
41
+ */
42
+ class ServiceRegistry {
43
+ /**
44
+ * 注册接口类
45
+ */
46
+ static register(interfaceClass, name) {
47
+ const className = name || interfaceClass.name;
48
+ ServiceRegistry.registry.set(className, interfaceClass);
49
+ ServiceRegistry.classToName.set(interfaceClass, className);
50
+ }
51
+ /**
52
+ * 通过名称获取接口类
53
+ */
54
+ static getByName(name) {
55
+ return ServiceRegistry.registry.get(name);
56
+ }
57
+ /**
58
+ * 获取接口类的名称
59
+ */
60
+ static getName(interfaceClass) {
61
+ return ServiceRegistry.classToName.get(interfaceClass) || interfaceClass.name;
62
+ }
63
+ }
64
+ exports.ServiceRegistry = ServiceRegistry;
65
+ ServiceRegistry.registry = new Map();
66
+ ServiceRegistry.classToName = new WeakMap();
67
+ /**
68
+ * 服务接口装饰器
69
+ * 用于标记接口类,使其可以通过名称查找
70
+ * 使用方式: @ServiceInterface() class IBizA extends ITypeDIBaseService { ... }
71
+ */
72
+ function ServiceInterface(name) {
73
+ return function (target) {
74
+ ServiceRegistry.register(target, name);
75
+ return target;
76
+ };
77
+ }
78
+ /**
79
+ * 获取服务接口类(用于内部实现)
80
+ */
81
+ function getServiceInterfaceByName(name) {
82
+ return ServiceRegistry.getByName(name);
83
+ }
84
+ /**
85
+ * 服务装饰器元数据的 key
86
+ */
87
+ const SERVICE_INTERFACE_KEY = 'typedi:service:interface';
88
+ /**
89
+ * 接口类到实现类的映射表
90
+ */
91
+ const interfaceToImplementation = new WeakMap();
92
+ /**
93
+ * 服务装饰器
94
+ * 用于标记实现类对应的接口
95
+ * 使用方式: @Service(IBizA)
96
+ */
97
+ function Service(interfaceClass) {
98
+ return function (target) {
99
+ // 将接口类存储到实现类的元数据中
100
+ Reflect.defineMetadata(SERVICE_INTERFACE_KEY, interfaceClass, target);
101
+ // 同时在实现类上设置静态属性(作为备用方案)
102
+ target.__interface__ = interfaceClass;
103
+ // 建立接口类到实现类的映射
104
+ interfaceToImplementation.set(interfaceClass, target);
105
+ };
106
+ }
107
+ /**
108
+ * 获取接口类对应的实现类
109
+ */
110
+ function getImplementationClass(interfaceClass) {
111
+ return interfaceToImplementation.get(interfaceClass);
112
+ }
113
+ /**
114
+ * 获取实现类对应的接口类
115
+ */
116
+ function getServiceInterface(target) {
117
+ // 首先尝试从元数据获取
118
+ const interfaceClass = Reflect.getMetadata(SERVICE_INTERFACE_KEY, target);
119
+ if (interfaceClass) {
120
+ return interfaceClass;
121
+ }
122
+ // 备用方案:从静态属性获取
123
+ return target.__interface__;
124
+ }
125
+ //# sourceMappingURL=ServiceToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceToken.js","sourceRoot":"","sources":["../../TypeDI/ServiceToken.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import 'reflect-metadata';
2
+ import { ITypeDIBaseService } from './ITypeDIBaseService';
3
+ import { ITypeDIManager } from './ITypeDIManager';
4
+ /**
5
+ * TypeDI 管理器实现
6
+ * 用于管理依赖注入的服务实例
7
+ */
8
+ export declare class TypeDIManagerImpl implements ITypeDIManager {
9
+ static readonly DEFAULT_KEY = "default";
10
+ private services;
11
+ private instanceToInterface;
12
+ constructor();
13
+ /**
14
+ * 绑定服务实例
15
+ * 使用方式: bind<IxxxService>(instance, key?)
16
+ * @param instance 服务实例
17
+ * @param key 可选的服务键,默认为 DEFAULT_KEY
18
+ */
19
+ bind<T extends ITypeDIBaseService>(instance: T, key?: string): void;
20
+ /**
21
+ * 获取服务实例(重载:传入接口类)
22
+ * 使用方式: getService(IBizA, key?)
23
+ */
24
+ getService<T extends ITypeDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
25
+ /**
26
+ * 获取服务实例(重载:传入接口名称)
27
+ * 使用方式: getService('IBizA', key?)
28
+ */
29
+ getService<T extends ITypeDIBaseService>(interfaceName: string, key?: string): T;
30
+ /**
31
+ * 通过 ManagerProvider 创建实例
32
+ * @param InterfaceClass 接口类
33
+ * @param key 服务键
34
+ * @returns 服务实例或 null
35
+ */
36
+ private createInstanceViaProvider;
37
+ /**
38
+ * 清除所有服务实例(主要用于测试)
39
+ */
40
+ clear(): void;
41
+ }
42
+ /**
43
+ * TypeDI 管理器单例
44
+ */
45
+ export declare class TypeDIManager {
46
+ private static instance;
47
+ /**
48
+ * 初始化管理器(应在应用启动时调用一次)
49
+ */
50
+ static init(manager?: ITypeDIManager): ITypeDIManager;
51
+ /**
52
+ * 获取单例实例(必须在 init 之后调用)
53
+ */
54
+ static getInstance(): ITypeDIManager;
55
+ /**
56
+ * 默认 key 常量
57
+ */
58
+ static readonly DEFAULT_KEY = "default";
59
+ }
60
+ //# sourceMappingURL=TypeDIManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeDIManager.d.ts","sourceRoot":"","sources":["../../TypeDI/TypeDIManager.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IAEtD,gBAAuB,WAAW,aAAa;IAG/C,OAAO,CAAC,QAAQ,CAA6D;IAG7E,OAAO,CAAC,mBAAmB,CAA4C;;IAIvE;;;;;OAKG;IACI,IAAI,CAAC,CAAC,SAAS,kBAAkB,EACtC,QAAQ,EAAE,CAAC,EACX,GAAG,GAAE,MAAsC,GAC1C,IAAI;IAuBP;;;OAGG;IACI,UAAU,CAAC,CAAC,SAAS,kBAAkB,EAC5C,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC;IACJ;;;OAGG;IACI,UAAU,CAAC,CAAC,SAAS,kBAAkB,EAC5C,aAAa,EAAE,MAAM,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC;IA4CJ;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAwDjC;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IAExC;;OAEG;WACW,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc;IAO5D;;OAEG;WACW,WAAW,IAAI,cAAc;IAO3C;;OAEG;IACH,gBAAuB,WAAW,aAAiC;CACpE"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeDIManager = exports.TypeDIManagerImpl = void 0;
4
+ require("reflect-metadata");
5
+ const ServiceToken_1 = require("./ServiceToken");
6
+ /**
7
+ * TypeDI 管理器实现
8
+ * 用于管理依赖注入的服务实例
9
+ */
10
+ class TypeDIManagerImpl {
11
+ constructor() {
12
+ // 使用接口构造函数作为 key,value 是 key-value 映射的 Map
13
+ this.services = new Map();
14
+ // 存储实例到接口类型的映射
15
+ this.instanceToInterface = new WeakMap();
16
+ }
17
+ /**
18
+ * 绑定服务实例
19
+ * 使用方式: bind<IxxxService>(instance, key?)
20
+ * @param instance 服务实例
21
+ * @param key 可选的服务键,默认为 DEFAULT_KEY
22
+ */
23
+ bind(instance, key = TypeDIManagerImpl.DEFAULT_KEY) {
24
+ // 从实例的构造函数中获取接口类型(优先使用装饰器元数据)
25
+ const InstanceClass = instance.constructor;
26
+ const InterfaceClass = (0, ServiceToken_1.getServiceInterface)(InstanceClass);
27
+ if (!InterfaceClass) {
28
+ throw new Error(`Cannot determine interface type for instance of ${InstanceClass.name}. ` +
29
+ `Please use @ServiceImpl(IBizA) decorator on the implementation class.`);
30
+ }
31
+ // 存储实例到接口的映射
32
+ this.instanceToInterface.set(instance, InterfaceClass);
33
+ if (!this.services.has(InterfaceClass)) {
34
+ this.services.set(InterfaceClass, new Map());
35
+ }
36
+ const serviceMap = this.services.get(InterfaceClass);
37
+ serviceMap.set(key, instance);
38
+ }
39
+ getService(InterfaceClassOrName, key) {
40
+ const actualKey = key ?? TypeDIManagerImpl.DEFAULT_KEY;
41
+ let InterfaceClass;
42
+ if (typeof InterfaceClassOrName === 'string') {
43
+ // 通过接口名称查找
44
+ const foundClass = (0, ServiceToken_1.getServiceInterfaceByName)(InterfaceClassOrName);
45
+ if (!foundClass) {
46
+ throw new Error(`Service interface "${InterfaceClassOrName}" not found. ` +
47
+ `Please ensure the interface class uses @ServiceInterface() decorator.`);
48
+ }
49
+ InterfaceClass = foundClass;
50
+ }
51
+ else {
52
+ InterfaceClass = InterfaceClassOrName;
53
+ }
54
+ const serviceMap = this.services.get(InterfaceClass);
55
+ // 如果找到了对应的服务映射
56
+ if (serviceMap) {
57
+ const instance = serviceMap.get(actualKey);
58
+ if (instance) {
59
+ return instance;
60
+ }
61
+ }
62
+ // 如果找不到实例,尝试通过 ManagerProvider 创建
63
+ const instance = this.createInstanceViaProvider(InterfaceClass, actualKey);
64
+ if (instance) {
65
+ return instance;
66
+ }
67
+ // 如果还是找不到,抛出错误
68
+ throw new Error(`Service instance not found for ${InterfaceClass.name} with key "${actualKey}"`);
69
+ }
70
+ /**
71
+ * 通过 ManagerProvider 创建实例
72
+ * @param InterfaceClass 接口类
73
+ * @param key 服务键
74
+ * @returns 服务实例或 null
75
+ */
76
+ createInstanceViaProvider(InterfaceClass, key) {
77
+ // 首先尝试从实现类获取 ManagerProvider
78
+ const ImplementationClass = (0, ServiceToken_1.getImplementationClass)(InterfaceClass);
79
+ if (ImplementationClass) {
80
+ const StaticImplClass = ImplementationClass;
81
+ if (StaticImplClass.ManagerProvider &&
82
+ typeof StaticImplClass.ManagerProvider === 'function') {
83
+ const instance = StaticImplClass.ManagerProvider();
84
+ // 将创建的实例存储到服务映射中(使用 default key)
85
+ if (!this.services.has(InterfaceClass)) {
86
+ this.services.set(InterfaceClass, new Map());
87
+ }
88
+ const serviceMap = this.services.get(InterfaceClass);
89
+ serviceMap.set(TypeDIManagerImpl.DEFAULT_KEY, instance);
90
+ // 如果请求的 key 不是 default,也存储一份
91
+ if (key !== TypeDIManagerImpl.DEFAULT_KEY) {
92
+ serviceMap.set(key, instance);
93
+ }
94
+ return instance;
95
+ }
96
+ }
97
+ // 备用方案:检查 InterfaceClass 是否有静态 ManagerProvider 方法(向后兼容)
98
+ const StaticInterfaceClass = InterfaceClass;
99
+ if (StaticInterfaceClass.ManagerProvider &&
100
+ typeof StaticInterfaceClass.ManagerProvider === 'function') {
101
+ const instance = StaticInterfaceClass.ManagerProvider();
102
+ // 将创建的实例存储到服务映射中(使用 default key)
103
+ if (!this.services.has(InterfaceClass)) {
104
+ this.services.set(InterfaceClass, new Map());
105
+ }
106
+ const serviceMap = this.services.get(InterfaceClass);
107
+ serviceMap.set(TypeDIManagerImpl.DEFAULT_KEY, instance);
108
+ // 如果请求的 key 不是 default,也存储一份
109
+ if (key !== TypeDIManagerImpl.DEFAULT_KEY) {
110
+ serviceMap.set(key, instance);
111
+ }
112
+ return instance;
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * 清除所有服务实例(主要用于测试)
118
+ */
119
+ clear() {
120
+ this.services.clear();
121
+ }
122
+ }
123
+ exports.TypeDIManagerImpl = TypeDIManagerImpl;
124
+ // 默认 key
125
+ TypeDIManagerImpl.DEFAULT_KEY = 'default';
126
+ /**
127
+ * TypeDI 管理器单例
128
+ */
129
+ class TypeDIManager {
130
+ /**
131
+ * 初始化管理器(应在应用启动时调用一次)
132
+ */
133
+ static init(manager) {
134
+ if (!TypeDIManager.instance) {
135
+ TypeDIManager.instance = manager || new TypeDIManagerImpl();
136
+ }
137
+ return TypeDIManager.instance;
138
+ }
139
+ /**
140
+ * 获取单例实例(必须在 init 之后调用)
141
+ */
142
+ static getInstance() {
143
+ if (!TypeDIManager.instance) {
144
+ throw new Error('TypeDIManager not initialized. Please call TypeDIManager.init() first.');
145
+ }
146
+ return TypeDIManager.instance;
147
+ }
148
+ }
149
+ exports.TypeDIManager = TypeDIManager;
150
+ /**
151
+ * 默认 key 常量
152
+ */
153
+ TypeDIManager.DEFAULT_KEY = TypeDIManagerImpl.DEFAULT_KEY;
154
+ //# sourceMappingURL=TypeDIManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeDIManager.js","sourceRoot":"","sources":["../../TypeDI/TypeDIManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import 'reflect-metadata';
2
+ import { ITypeDIBaseService } from './ITypeDIBaseService';
3
+ /**
4
+ * 通过类型获取服务实例的辅助函数
5
+ * 使用方式: getServiceByType<IBizA>(IBizA, key?)
6
+ *
7
+ * 注意:由于 TypeScript 泛型在运行时会被擦除,仍需要传入接口类作为参数。
8
+ * 但通过这个辅助函数,调用方式更接近 getService<IBizA>(IBizA, key?) 的形式。
9
+ *
10
+ * 为了支持 getService<IBizA>(key) 的调用方式(不需要传入接口类),
11
+ * 可以使用接口类的静态属性:getServiceByType(IBizA.__self__, key)
12
+ */
13
+ export declare function getServiceByType<T extends ITypeDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
14
+ /**
15
+ * 通过接口类的静态属性获取服务实例
16
+ * 使用方式: getService<IBizA>(IBizA.__self__, key?)
17
+ *
18
+ * 这样可以在调用时只写一次接口类名称,更接近 getService<IBizA>(key) 的形式
19
+ */
20
+ export declare function getService<T extends ITypeDIBaseService>(InterfaceClassRef: abstract new () => T, key?: string): T;
21
+ //# sourceMappingURL=getServiceByType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getServiceByType.d.ts","sourceRoot":"","sources":["../../TypeDI/getServiceByType.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,kBAAkB,EAC3D,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAGH;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,kBAAkB,EACrD,iBAAiB,EAAE,QAAQ,WAAW,CAAC,EACvC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAEH"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getServiceByType = getServiceByType;
4
+ exports.getService = getService;
5
+ require("reflect-metadata");
6
+ const TypeDIManager_1 = require("./TypeDIManager");
7
+ /**
8
+ * 通过类型获取服务实例的辅助函数
9
+ * 使用方式: getServiceByType<IBizA>(IBizA, key?)
10
+ *
11
+ * 注意:由于 TypeScript 泛型在运行时会被擦除,仍需要传入接口类作为参数。
12
+ * 但通过这个辅助函数,调用方式更接近 getService<IBizA>(IBizA, key?) 的形式。
13
+ *
14
+ * 为了支持 getService<IBizA>(key) 的调用方式(不需要传入接口类),
15
+ * 可以使用接口类的静态属性:getServiceByType(IBizA.__self__, key)
16
+ */
17
+ function getServiceByType(InterfaceClass, key) {
18
+ const manager = TypeDIManager_1.TypeDIManager.getInstance();
19
+ return manager.getService(InterfaceClass, key);
20
+ }
21
+ /**
22
+ * 通过接口类的静态属性获取服务实例
23
+ * 使用方式: getService<IBizA>(IBizA.__self__, key?)
24
+ *
25
+ * 这样可以在调用时只写一次接口类名称,更接近 getService<IBizA>(key) 的形式
26
+ */
27
+ function getService(InterfaceClassRef, key) {
28
+ return getServiceByType(InterfaceClassRef, key);
29
+ }
30
+ //# sourceMappingURL=getServiceByType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getServiceByType.js","sourceRoot":"","sources":["../../TypeDI/getServiceByType.ts"],"names":[],"mappings":";;AAcA,4CAMC;AAQD,gCAKC;AAjCD,4BAA0B;AAC1B,mDAAgD;AAGhD;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAC9B,cAAoC,EACpC,GAAY;IAEZ,MAAM,OAAO,GAAG,6BAAa,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CACxB,iBAAuC,EACvC,GAAY;IAEZ,OAAO,gBAAgB,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import 'reflect-metadata';
2
+ import { ITypeDIBaseService } from './ITypeDIBaseService';
3
+ /**
4
+ * 全局便捷函数
5
+ * 提供简洁的 API 来使用 TypeDI
6
+ */
7
+ /**
8
+ * 绑定服务实例
9
+ * @param instance 服务实例
10
+ * @param key 可选的服务键,默认为 'default'
11
+ */
12
+ export declare function bind<T extends ITypeDIBaseService>(instance: T, key?: string): void;
13
+ /**
14
+ * 获取服务实例
15
+ * @param InterfaceClass 接口类
16
+ * @param key 可选的服务键,默认为 'default'
17
+ */
18
+ export declare function getService<T extends ITypeDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
19
+ /**
20
+ * 获取服务实例(通过接口名称)
21
+ * @param interfaceName 接口名称
22
+ * @param key 可选的服务键,默认为 'default'
23
+ */
24
+ export declare function getService<T extends ITypeDIBaseService>(interfaceName: string, key?: string): T;
25
+ /**
26
+ * 清除所有服务实例(主要用于测试)
27
+ */
28
+ export declare function clear(): void;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../TypeDI/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,kBAAkB,EAC/C,QAAQ,EAAE,CAAC,EACX,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,kBAAkB,EACrD,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAAC;AACL;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,kBAAkB,EACrD,aAAa,EAAE,MAAM,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAAC;AAQL;;GAEG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAE5B"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bind = bind;
4
+ exports.getService = getService;
5
+ exports.clear = clear;
6
+ require("reflect-metadata");
7
+ const TypeDIManager_1 = require("./TypeDIManager");
8
+ /**
9
+ * 全局便捷函数
10
+ * 提供简洁的 API 来使用 TypeDI
11
+ */
12
+ /**
13
+ * 绑定服务实例
14
+ * @param instance 服务实例
15
+ * @param key 可选的服务键,默认为 'default'
16
+ */
17
+ function bind(instance, key) {
18
+ TypeDIManager_1.TypeDIManager.getInstance().bind(instance, key);
19
+ }
20
+ function getService(InterfaceClassOrName, key) {
21
+ return TypeDIManager_1.TypeDIManager.getInstance().getService(InterfaceClassOrName, key);
22
+ }
23
+ /**
24
+ * 清除所有服务实例(主要用于测试)
25
+ */
26
+ function clear() {
27
+ TypeDIManager_1.TypeDIManager.getInstance().clear();
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../TypeDI/index.ts"],"names":[],"mappings":";;AAcA,oBAKC;AAoBD,gCAKC;AAKD,sBAEC;AAnDD,4BAA0B;AAC1B,mDAAgD;AAGhD;;;GAGG;AAEH;;;;GAIG;AACH,SAAgB,IAAI,CAClB,QAAW,EACX,GAAY;IAEZ,6BAAa,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAoBD,SAAgB,UAAU,CACxB,oBAAqD,EACrD,GAAY;IAEZ,OAAO,6BAAa,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,oBAA2B,EAAE,GAAG,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK;IACnB,6BAAa,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * LightDI - TypeScript 依赖注入框架
3
+ * 主入口文件,导出所有公共 API
4
+ */
5
+ import 'reflect-metadata';
6
+ export { ITypeDIBaseService } from '../TypeDI/ITypeDIBaseService';
7
+ export { ITypeDIManager } from '../TypeDI/ITypeDIManager';
8
+ export { TypeDIManager, TypeDIManagerImpl } from '../TypeDI/TypeDIManager';
9
+ export { ServiceInterface, Service, ServiceToken, getServiceInterface, getServiceInterfaceByName } from '../TypeDI/ServiceToken';
10
+ export { ServiceImpl } from '../TypeDI/BaseServiceImpl';
11
+ export { bind, getService, clear } from '../TypeDI/index';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG3E,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACjI,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * LightDI - TypeScript 依赖注入框架
4
+ * 主入口文件,导出所有公共 API
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.clear = exports.getService = exports.bind = exports.ServiceImpl = exports.getServiceInterfaceByName = exports.getServiceInterface = exports.ServiceToken = exports.Service = exports.ServiceInterface = exports.TypeDIManagerImpl = exports.TypeDIManager = exports.ITypeDIBaseService = void 0;
8
+ // 导入 reflect-metadata(必须在最前面)
9
+ require("reflect-metadata");
10
+ // 导出核心类型和接口
11
+ var ITypeDIBaseService_1 = require("../TypeDI/ITypeDIBaseService");
12
+ Object.defineProperty(exports, "ITypeDIBaseService", { enumerable: true, get: function () { return ITypeDIBaseService_1.ITypeDIBaseService; } });
13
+ // 导出管理器
14
+ var TypeDIManager_1 = require("../TypeDI/TypeDIManager");
15
+ Object.defineProperty(exports, "TypeDIManager", { enumerable: true, get: function () { return TypeDIManager_1.TypeDIManager; } });
16
+ Object.defineProperty(exports, "TypeDIManagerImpl", { enumerable: true, get: function () { return TypeDIManager_1.TypeDIManagerImpl; } });
17
+ // 导出装饰器和工具函数
18
+ var ServiceToken_1 = require("../TypeDI/ServiceToken");
19
+ Object.defineProperty(exports, "ServiceInterface", { enumerable: true, get: function () { return ServiceToken_1.ServiceInterface; } });
20
+ Object.defineProperty(exports, "Service", { enumerable: true, get: function () { return ServiceToken_1.Service; } });
21
+ Object.defineProperty(exports, "ServiceToken", { enumerable: true, get: function () { return ServiceToken_1.ServiceToken; } });
22
+ Object.defineProperty(exports, "getServiceInterface", { enumerable: true, get: function () { return ServiceToken_1.getServiceInterface; } });
23
+ Object.defineProperty(exports, "getServiceInterfaceByName", { enumerable: true, get: function () { return ServiceToken_1.getServiceInterfaceByName; } });
24
+ var BaseServiceImpl_1 = require("../TypeDI/BaseServiceImpl");
25
+ Object.defineProperty(exports, "ServiceImpl", { enumerable: true, get: function () { return BaseServiceImpl_1.ServiceImpl; } });
26
+ // 导出全局便捷函数
27
+ var index_1 = require("../TypeDI/index");
28
+ Object.defineProperty(exports, "bind", { enumerable: true, get: function () { return index_1.bind; } });
29
+ Object.defineProperty(exports, "getService", { enumerable: true, get: function () { return index_1.getService; } });
30
+ Object.defineProperty(exports, "clear", { enumerable: true, get: function () { return index_1.clear; } });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,8BAA8B;AAC9B,4BAA0B;AAE1B,YAAY;AACZ,mEAAkE;AAAzD,wHAAA,kBAAkB,OAAA;AAG3B,QAAQ;AACR,yDAA2E;AAAlE,8GAAA,aAAa,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AAEzC,aAAa;AACb,uDAAiI;AAAxH,gHAAA,gBAAgB,OAAA;AAAE,uGAAA,OAAO,OAAA;AAAE,4GAAA,YAAY,OAAA;AAAE,mHAAA,mBAAmB,OAAA;AAAE,yHAAA,yBAAyB,OAAA;AAChG,6DAAwD;AAA/C,8GAAA,WAAW,OAAA;AAEpB,WAAW;AACX,yCAA0D;AAAjD,6FAAA,IAAI,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,8FAAA,KAAK,OAAA"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "light-di",
3
+ "version": "1.0.0",
4
+ "description": "LightDI - TypeScript Dependency Injection Framework - 服务之间只通过接口依赖,实现解耦",
5
+ "main": "dist/src/index.js",
6
+ "types": "dist/src/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md",
10
+ "LICENSE"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "prepublishOnly": "npm run build",
15
+ "start": "ts-node index.ts",
16
+ "test": "npm start"
17
+ },
18
+ "keywords": [
19
+ "typescript",
20
+ "dependency-injection",
21
+ "di",
22
+ "ioc",
23
+ "inversion-of-control",
24
+ "decorator",
25
+ "reflect-metadata"
26
+ ],
27
+ "author": "",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/SourceKim/EasyDI.git"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/SourceKim/EasyDI/issues"
35
+ },
36
+ "homepage": "https://github.com/SourceKim/EasyDI#readme",
37
+ "dependencies": {
38
+ "reflect-metadata": "^0.1.13"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^20.0.0",
42
+ "ts-node": "^10.9.0",
43
+ "typescript": "^5.0.0"
44
+ },
45
+ "peerDependencies": {
46
+ "typescript": ">=4.0.0"
47
+ },
48
+ "engines": {
49
+ "node": ">=14.0.0"
50
+ }
51
+ }
52
+