light-di 1.0.0 → 1.3.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 (55) hide show
  1. package/README.en.md +104 -0
  2. package/README.md +13 -22
  3. package/dist/LightDI/BaseServiceImpl.d.ts +13 -0
  4. package/dist/LightDI/BaseServiceImpl.d.ts.map +1 -0
  5. package/dist/LightDI/BaseServiceImpl.js +31 -0
  6. package/dist/LightDI/BaseServiceImpl.js.map +1 -0
  7. package/dist/LightDI/ILightDIBaseService.d.ts +7 -0
  8. package/dist/LightDI/ILightDIBaseService.d.ts.map +1 -0
  9. package/dist/LightDI/ILightDIBaseService.js +11 -0
  10. package/dist/LightDI/ILightDIBaseService.js.map +1 -0
  11. package/dist/LightDI/ILightDIManager.d.ts +23 -0
  12. package/dist/LightDI/ILightDIManager.d.ts.map +1 -0
  13. package/dist/LightDI/ILightDIManager.js +3 -0
  14. package/dist/LightDI/ILightDIManager.js.map +1 -0
  15. package/dist/LightDI/LightDIManager.d.ts +47 -0
  16. package/dist/LightDI/LightDIManager.d.ts.map +1 -0
  17. package/dist/LightDI/LightDIManager.js +98 -0
  18. package/dist/LightDI/LightDIManager.js.map +1 -0
  19. package/dist/LightDI/ServiceToken.d.ts +15 -0
  20. package/dist/LightDI/ServiceToken.d.ts.map +1 -0
  21. package/dist/LightDI/ServiceToken.js +45 -0
  22. package/dist/LightDI/ServiceToken.js.map +1 -0
  23. package/dist/LightDI/index.d.ts +28 -0
  24. package/dist/LightDI/index.d.ts.map +1 -0
  25. package/dist/LightDI/index.js +43 -0
  26. package/dist/LightDI/index.js.map +1 -0
  27. package/dist/TypeDI/BaseServiceImpl.d.ts +3 -4
  28. package/dist/TypeDI/BaseServiceImpl.d.ts.map +1 -1
  29. package/dist/TypeDI/BaseServiceImpl.js +1 -2
  30. package/dist/TypeDI/BaseServiceImpl.js.map +1 -1
  31. package/dist/TypeDI/ILightDIBaseService.d.ts +7 -0
  32. package/dist/TypeDI/ILightDIBaseService.d.ts.map +1 -0
  33. package/dist/TypeDI/ILightDIBaseService.js +11 -0
  34. package/dist/TypeDI/ILightDIBaseService.js.map +1 -0
  35. package/dist/TypeDI/ILightDIManager.d.ts +23 -0
  36. package/dist/TypeDI/ILightDIManager.d.ts.map +1 -0
  37. package/dist/TypeDI/ILightDIManager.js +3 -0
  38. package/dist/TypeDI/ILightDIManager.js.map +1 -0
  39. package/dist/TypeDI/LightDIManager.d.ts +54 -0
  40. package/dist/TypeDI/LightDIManager.d.ts.map +1 -0
  41. package/dist/TypeDI/LightDIManager.js +132 -0
  42. package/dist/TypeDI/LightDIManager.js.map +1 -0
  43. package/dist/TypeDI/ServiceToken.d.ts +2 -51
  44. package/dist/TypeDI/ServiceToken.d.ts.map +1 -1
  45. package/dist/TypeDI/ServiceToken.js +8 -88
  46. package/dist/TypeDI/ServiceToken.js.map +1 -1
  47. package/dist/TypeDI/index.d.ts +12 -13
  48. package/dist/TypeDI/index.d.ts.map +1 -1
  49. package/dist/TypeDI/index.js +24 -10
  50. package/dist/TypeDI/index.js.map +1 -1
  51. package/dist/src/index.d.ts +5 -7
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +8 -16
  54. package/dist/src/index.js.map +1 -1
  55. package/package.json +6 -10
package/README.en.md ADDED
@@ -0,0 +1,104 @@
1
+ # LightDI - TypeScript Dependency Injection Framework
2
+
3
+ [中文](README.md) | English
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install light-di
9
+ ```
10
+
11
+ ## Design Philosophy
12
+
13
+ LightDI aims to decouple services: **Services depend only on interfaces, without needing to know the implementation**. Through dependency injection, you can easily replace implementation classes, improving code maintainability and testability.
14
+
15
+ ## Core Features
16
+
17
+ ### 1. Bind and Get Services
18
+ - `bind<IxxxService>(ImplClass, key?)` - Bind a service implementation class
19
+ - `getService(InterfaceClass, key?)` - Get a service instance
20
+
21
+ **Purpose of key**: Used to implement scenarios where one interface has multiple instances. The same interface can be bound to multiple instances with different keys, default key is `default`.
22
+
23
+ ### 2. ManagerProvider Auto-creation
24
+ If `getService` cannot find an instance, it will automatically call the implementation class's `ManagerProvider()` method to create an instance and cache it, **no need to manually `new` the implementation class**.
25
+
26
+ ## Usage Requirements
27
+
28
+ ### Interface File (IxxxService.ts)
29
+ - Extend `ILightDIBaseService`
30
+ - Only contains interface definitions
31
+
32
+ ### Implementation File (xxxImpl.ts)
33
+ - Implement the interface
34
+ - Use `@ServiceImpl(InterfaceClass)` decorator
35
+ - `ManagerProvider()` method is automatically created by the decorator
36
+
37
+ ## Examples
38
+
39
+ ### Define Services
40
+
41
+ **Interface Definition (IBizA.ts)**
42
+ ```typescript
43
+ import { ILightDIBaseService } from 'light-di';
44
+
45
+ export abstract class IBizA extends ILightDIBaseService {
46
+ abstract value: number;
47
+ abstract print(): void;
48
+ }
49
+ ```
50
+
51
+ **Implementation Definition (BizAImpl.ts)**
52
+ ```typescript
53
+ import { IBizA } from './IBizA';
54
+ import { ServiceImpl } from 'light-di';
55
+
56
+ @ServiceImpl(IBizA)
57
+ export class BizAImpl implements IBizA {
58
+ public value: number = 10;
59
+ public print(): void {
60
+ console.log('BizA:', this.value);
61
+ }
62
+ }
63
+ ```
64
+
65
+ ### Basic Usage
66
+
67
+ ```typescript
68
+ import { bind, getService } from 'light-di';
69
+ import { IBizA } from './IBizA';
70
+
71
+ // Method 1: Manually bind implementation class
72
+ bind<IBizA>(BizAImpl);
73
+
74
+ // Method 2: Auto-create (no need to manually new)
75
+ // Directly get service, if not bound, will automatically call ManagerProvider() to create instance
76
+ const bizA = getService(IBizA); // Auto-create BizAImpl instance
77
+
78
+ // Multiple instance binding (using different keys)
79
+ bind<IBizA>(BizAImpl, 'key1');
80
+ const bizAWithKey1 = getService(IBizA, 'key1'); // Get instance with key1
81
+ const bizADefault = getService(IBizA); // Get instance with default key
82
+ ```
83
+
84
+ ### Service Dependency Example
85
+
86
+ ```typescript
87
+ import { ServiceImpl, getService } from 'light-di';
88
+ import { IBizA } from './IBizA';
89
+ import { IBizB } from './IBizB';
90
+
91
+ // BizB depends on IBizA, but only needs to depend on the interface, no need to know the implementation
92
+ @ServiceImpl(IBizB)
93
+ export class BizBImpl implements IBizB {
94
+ private bizA: IBizA;
95
+
96
+ constructor() {
97
+ // Get dependency through interface, achieving decoupling
98
+ this.bizA = getService(IBizA);
99
+ }
100
+ }
101
+ ```
102
+
103
+ For detailed examples, see `index.ts` and `example/` directory.
104
+
package/README.md CHANGED
@@ -1,36 +1,32 @@
1
1
  # LightDI - TypeScript 依赖注入框架
2
2
 
3
+ [English](README.en.md) | 中文
4
+
3
5
  ## 安装
4
6
 
5
7
  ```bash
6
- npm install light-di reflect-metadata
8
+ npm install light-di
7
9
  ```
8
10
 
9
- **注意**:需要安装 `reflect-metadata` 作为 peer dependency。
10
-
11
11
  ## 设计理念
12
12
 
13
13
  LightDI 旨在实现服务之间的解耦:**服务之间只通过接口依赖,无需关注具体实现**。通过依赖注入,可以轻松替换实现类,提高代码的可维护性和可测试性。
14
14
 
15
15
  ## 核心功能
16
16
 
17
- ### 1. 初始化
18
- 应用启动时调用一次 `TypeDIManager.init()` 初始化单例。
19
-
20
- ### 2. 绑定和获取服务
21
- - `bind<IxxxService>(instance, key?)` - 绑定服务实例
17
+ ### 1. 绑定和获取服务
18
+ - `bind<IxxxService>(ImplClass, key?)` - 绑定服务实现类
22
19
  - `getService(InterfaceClass, key?)` - 获取服务实例
23
20
 
24
21
  **key 的作用**:用于实现一个接口有多个实例的场景。同一个接口可以通过不同的 key 绑定多个实例,默认 key 为 `default`。
25
22
 
26
- ### 3. ManagerProvider 自动创建
23
+ ### 2. ManagerProvider 自动创建
27
24
  如果 `getService` 找不到实例,会自动调用实现类的 `ManagerProvider()` 方法创建实例并缓存,**无需手动 new 实现类**。
28
25
 
29
26
  ## 使用要求
30
27
 
31
28
  ### 接口文件 (IxxxService.ts)
32
- - 继承 `ITypeDIBaseService`
33
- - 使用 `@ServiceInterface()` 装饰器
29
+ - 继承 `ILightDIBaseService`
34
30
  - 只包含接口定义
35
31
 
36
32
  ### 实现文件 (xxxImpl.ts)
@@ -44,10 +40,9 @@ LightDI 旨在实现服务之间的解耦:**服务之间只通过接口依赖
44
40
 
45
41
  **接口定义 (IBizA.ts)**
46
42
  ```typescript
47
- import { ITypeDIBaseService, ServiceInterface } from 'light-di';
43
+ import { ILightDIBaseService } from 'light-di';
48
44
 
49
- @ServiceInterface()
50
- export abstract class IBizA extends ITypeDIBaseService {
45
+ export abstract class IBizA extends ILightDIBaseService {
51
46
  abstract value: number;
52
47
  abstract print(): void;
53
48
  }
@@ -70,22 +65,18 @@ export class BizAImpl implements IBizA {
70
65
  ### 基本使用
71
66
 
72
67
  ```typescript
73
- import 'reflect-metadata';
74
- import { TypeDIManager, bind, getService } from 'light-di';
68
+ import { bind, getService } from 'light-di';
75
69
  import { IBizA } from './IBizA';
76
70
 
77
- // 初始化(应用启动时调用一次)
78
- TypeDIManager.init();
79
-
80
- // 方式1: 手动绑定实例
81
- bind<IBizA>(new BizAImpl());
71
+ // 方式1: 手动绑定实现类
72
+ bind<IBizA>(BizAImpl);
82
73
 
83
74
  // 方式2: 自动创建(无需手动 new)
84
75
  // 直接获取服务,如果未绑定会自动调用 ManagerProvider() 创建实例
85
76
  const bizA = getService(IBizA); // 自动创建 BizAImpl 实例
86
77
 
87
78
  // 多实例绑定(使用不同的 key)
88
- bind<IBizA>(new BizAImpl(), 'key1');
79
+ bind<IBizA>(BizAImpl, 'key1');
89
80
  const bizAWithKey1 = getService(IBizA, 'key1'); // 获取 key1 对应的实例
90
81
  const bizADefault = getService(IBizA); // 获取 default key 对应的实例
91
82
  ```
@@ -0,0 +1,13 @@
1
+ import { ILightDIBaseService } from './ILightDIBaseService';
2
+ /**
3
+ * 服务实现装饰器
4
+ * 自动设置 LightDI 相关的静态属性和方法
5
+ *
6
+ * 使用方式:
7
+ * @ServiceImpl(IBizA)
8
+ * export class BizAImpl implements IBizA {
9
+ * // 实现接口方法
10
+ * }
11
+ */
12
+ export declare function ServiceImpl<T extends ILightDIBaseService>(interfaceClass: abstract new () => T): <U extends new () => T>(target: U) => U;
13
+ //# sourceMappingURL=BaseServiceImpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseServiceImpl.d.ts","sourceRoot":"","sources":["../../LightDI/BaseServiceImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,mBAAmB,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,IAC5E,CAAC,SAAS,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAG,CAAC,CAiBtD"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceImpl = ServiceImpl;
4
+ const ServiceToken_1 = require("./ServiceToken");
5
+ /**
6
+ * 服务实现装饰器
7
+ * 自动设置 LightDI 相关的静态属性和方法
8
+ *
9
+ * 使用方式:
10
+ * @ServiceImpl(IBizA)
11
+ * export class BizAImpl implements IBizA {
12
+ * // 实现接口方法
13
+ * }
14
+ */
15
+ function ServiceImpl(interfaceClass) {
16
+ return function (target) {
17
+ // 应用 Service 装饰器(建立接口到实现的映射)
18
+ (0, ServiceToken_1.Service)(interfaceClass)(target);
19
+ // 设置静态属性
20
+ target.__interface__ = interfaceClass;
21
+ target.__self__ = interfaceClass;
22
+ // 设置 ManagerProvider 方法(如果不存在)
23
+ if (!target.ManagerProvider) {
24
+ target.ManagerProvider = function () {
25
+ return new target();
26
+ };
27
+ }
28
+ return target;
29
+ };
30
+ }
31
+ //# sourceMappingURL=BaseServiceImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseServiceImpl.js","sourceRoot":"","sources":["../../LightDI/BaseServiceImpl.ts"],"names":[],"mappings":";;AAaA,kCAkBC;AA9BD,iDAAyC;AAEzC;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAgC,cAAoC;IAC7F,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
+ * LightDI 基础服务抽象类
3
+ * 所有服务接口都应该继承此类
4
+ */
5
+ export declare abstract class ILightDIBaseService {
6
+ }
7
+ //# sourceMappingURL=ILightDIBaseService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILightDIBaseService.d.ts","sourceRoot":"","sources":["../../LightDI/ILightDIBaseService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,8BAAsB,mBAAmB;CAGxC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ILightDIBaseService = void 0;
4
+ /**
5
+ * LightDI 基础服务抽象类
6
+ * 所有服务接口都应该继承此类
7
+ */
8
+ class ILightDIBaseService {
9
+ }
10
+ exports.ILightDIBaseService = ILightDIBaseService;
11
+ //# sourceMappingURL=ILightDIBaseService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILightDIBaseService.js","sourceRoot":"","sources":["../../LightDI/ILightDIBaseService.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAsB,mBAAmB;CAGxC;AAHD,kDAGC"}
@@ -0,0 +1,23 @@
1
+ import { ILightDIBaseService } from './ILightDIBaseService';
2
+ /**
3
+ * LightDI 管理器接口
4
+ */
5
+ export interface ILightDIManager {
6
+ /**
7
+ * 绑定服务实现类
8
+ * @param ImplementationClass 服务实现类
9
+ * @param key 可选的服务键,默认为 'default'
10
+ */
11
+ bind<T extends ILightDIBaseService>(ImplementationClass: new () => T, key?: string): void;
12
+ /**
13
+ * 获取服务实例
14
+ * @param InterfaceClass 接口类
15
+ * @param key 可选的服务键,默认为 'default'
16
+ */
17
+ getService<T extends ILightDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
18
+ /**
19
+ * 清除所有服务实例(主要用于测试)
20
+ */
21
+ clear(): void;
22
+ }
23
+ //# sourceMappingURL=ILightDIManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILightDIManager.d.ts","sourceRoot":"","sources":["../../LightDI/ILightDIManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,mBAAmB,EAChC,mBAAmB,EAAE,UAAU,CAAC,EAChC,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CAAC;IAER;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,mBAAmB,EACtC,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,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=ILightDIManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILightDIManager.js","sourceRoot":"","sources":["../../LightDI/ILightDIManager.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { ILightDIBaseService } from './ILightDIBaseService';
2
+ import { ILightDIManager } from './ILightDIManager';
3
+ /**
4
+ * LightDI 管理器实现
5
+ * 用于管理依赖注入的服务实例
6
+ */
7
+ export declare class LightDIManagerImpl implements ILightDIManager {
8
+ static readonly DEFAULT_KEY = "default";
9
+ private services;
10
+ private instanceToInterface;
11
+ constructor();
12
+ /**
13
+ * 绑定服务实现类
14
+ * 使用方式: bind<IxxxService>(ImplClass, key?)
15
+ * @param ImplClass 服务实现类
16
+ * @param key 可选的服务键,默认为 DEFAULT_KEY
17
+ */
18
+ bind<T extends ILightDIBaseService>(ImplClass: new () => T, key?: string): void;
19
+ /**
20
+ * 获取服务实例
21
+ * 使用方式: getService(IBizA, key?)
22
+ */
23
+ getService<T extends ILightDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
24
+ /**
25
+ * 清除所有服务实例(主要用于测试)
26
+ */
27
+ clear(): void;
28
+ }
29
+ /**
30
+ * LightDI 管理器单例
31
+ */
32
+ export declare class LightDIManager {
33
+ private static instance;
34
+ /**
35
+ * 初始化管理器(应在应用启动时调用一次)
36
+ */
37
+ static init(manager?: ILightDIManager): ILightDIManager;
38
+ /**
39
+ * 获取单例实例(如果未初始化则自动初始化)
40
+ */
41
+ static getInstance(): ILightDIManager;
42
+ /**
43
+ * 默认 key 常量
44
+ */
45
+ static readonly DEFAULT_KEY = "default";
46
+ }
47
+ //# sourceMappingURL=LightDIManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightDIManager.d.ts","sourceRoot":"","sources":["../../LightDI/LightDIManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IAExD,gBAAuB,WAAW,aAAa;IAG/C,OAAO,CAAC,QAAQ,CAA8D;IAG9E,OAAO,CAAC,mBAAmB,CAA4C;;IAIvE;;;;;OAKG;IACI,IAAI,CAAC,CAAC,SAAS,mBAAmB,EACvC,SAAS,EAAE,UAAU,CAAC,EACtB,GAAG,GAAE,MAAuC,GAC3C,IAAI;IA2BP;;;OAGG;IACI,UAAU,CAAC,CAAC,SAAS,mBAAmB,EAC7C,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC;IAmBJ;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;WACW,IAAI,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,eAAe;IAO9D;;OAEG;WACW,WAAW,IAAI,eAAe;IAO5C;;OAEG;IACH,gBAAuB,WAAW,aAAkC;CACrE"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LightDIManager = exports.LightDIManagerImpl = void 0;
4
+ const ServiceToken_1 = require("./ServiceToken");
5
+ /**
6
+ * LightDI 管理器实现
7
+ * 用于管理依赖注入的服务实例
8
+ */
9
+ class LightDIManagerImpl {
10
+ constructor() {
11
+ // 使用接口构造函数作为 key,value 是 key-value 映射的 Map
12
+ this.services = new Map();
13
+ // 存储实例到接口类型的映射
14
+ this.instanceToInterface = new WeakMap();
15
+ }
16
+ /**
17
+ * 绑定服务实现类
18
+ * 使用方式: bind<IxxxService>(ImplClass, key?)
19
+ * @param ImplClass 服务实现类
20
+ * @param key 可选的服务键,默认为 DEFAULT_KEY
21
+ */
22
+ bind(ImplClass, key = LightDIManagerImpl.DEFAULT_KEY) {
23
+ // 从实现类中获取接口类型
24
+ const InterfaceClass = (0, ServiceToken_1.getServiceInterface)(ImplClass);
25
+ // 创建实例,优先使用 ManagerProvider
26
+ let instance;
27
+ const StaticImplClass = ImplClass;
28
+ if (StaticImplClass.ManagerProvider &&
29
+ typeof StaticImplClass.ManagerProvider === 'function') {
30
+ instance = StaticImplClass.ManagerProvider();
31
+ }
32
+ else {
33
+ instance = new ImplClass();
34
+ }
35
+ // 存储实例到接口的映射
36
+ this.instanceToInterface.set(instance, InterfaceClass);
37
+ if (!this.services.has(InterfaceClass)) {
38
+ this.services.set(InterfaceClass, new Map());
39
+ }
40
+ const serviceMap = this.services.get(InterfaceClass);
41
+ serviceMap.set(key, instance);
42
+ }
43
+ /**
44
+ * 获取服务实例
45
+ * 使用方式: getService(IBizA, key?)
46
+ */
47
+ getService(InterfaceClass, key) {
48
+ const actualKey = key ?? LightDIManagerImpl.DEFAULT_KEY;
49
+ const serviceMap = this.services.get(InterfaceClass);
50
+ // 如果找到了对应的服务映射
51
+ if (serviceMap) {
52
+ const instance = serviceMap.get(actualKey);
53
+ if (instance) {
54
+ return instance;
55
+ }
56
+ }
57
+ // 如果找不到实例,抛出错误
58
+ throw new Error(`Service instance not found for ${InterfaceClass.name} with key "${actualKey}"`);
59
+ }
60
+ /**
61
+ * 清除所有服务实例(主要用于测试)
62
+ */
63
+ clear() {
64
+ this.services.clear();
65
+ }
66
+ }
67
+ exports.LightDIManagerImpl = LightDIManagerImpl;
68
+ // 默认 key
69
+ LightDIManagerImpl.DEFAULT_KEY = 'default';
70
+ /**
71
+ * LightDI 管理器单例
72
+ */
73
+ class LightDIManager {
74
+ /**
75
+ * 初始化管理器(应在应用启动时调用一次)
76
+ */
77
+ static init(manager) {
78
+ if (!LightDIManager.instance) {
79
+ LightDIManager.instance = manager || new LightDIManagerImpl();
80
+ }
81
+ return LightDIManager.instance;
82
+ }
83
+ /**
84
+ * 获取单例实例(如果未初始化则自动初始化)
85
+ */
86
+ static getInstance() {
87
+ if (!LightDIManager.instance) {
88
+ return LightDIManager.init();
89
+ }
90
+ return LightDIManager.instance;
91
+ }
92
+ }
93
+ exports.LightDIManager = LightDIManager;
94
+ /**
95
+ * 默认 key 常量
96
+ */
97
+ LightDIManager.DEFAULT_KEY = LightDIManagerImpl.DEFAULT_KEY;
98
+ //# sourceMappingURL=LightDIManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightDIManager.js","sourceRoot":"","sources":["../../LightDI/LightDIManager.ts"],"names":[],"mappings":";;;AACA,iDAAqD;AAGrD;;;GAGG;AACH,MAAa,kBAAkB;IAU7B;QANA,2CAA2C;QACnC,aAAQ,GAAoD,IAAI,GAAG,EAAE,CAAC;QAE9E,eAAe;QACP,wBAAmB,GAA8B,IAAI,OAAO,EAAE,CAAC;IAEvD,CAAC;IAEjB;;;;;OAKG;IACI,IAAI,CACT,SAAsB,EACtB,MAAc,kBAAkB,CAAC,WAAW;QAE5C,cAAc;QACd,MAAM,cAAc,GAAG,IAAA,kCAAmB,EAAC,SAAS,CAAC,CAAC;QAEtD,4BAA4B;QAC5B,IAAI,QAAW,CAAC;QAChB,MAAM,eAAe,GAAG,SAAgB,CAAC;QACzC,IACE,eAAe,CAAC,eAAe;YAC/B,OAAO,eAAe,CAAC,eAAe,KAAK,UAAU,EACrD,CAAC;YACD,QAAQ,GAAG,eAAe,CAAC,eAAe,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7B,CAAC;QAED,aAAa;QACb,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;QACtD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACI,UAAU,CACf,cAAoC,EACpC,GAAY;QAEZ,MAAM,SAAS,GAAG,GAAG,IAAI,kBAAkB,CAAC,WAAW,CAAC;QAExD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAErD,eAAe;QACf,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAED,eAAe;QACf,MAAM,IAAI,KAAK,CACb,kCAAkC,cAAc,CAAC,IAAI,cAAc,SAAS,GAAG,CAChF,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;;AA/EH,gDAgFC;AA/EC,SAAS;AACc,8BAAW,GAAG,SAAS,AAAZ,CAAa;AAgFjD;;GAEG;AACH,MAAa,cAAc;IAGzB;;OAEG;IACI,MAAM,CAAC,IAAI,CAAC,OAAyB;QAC1C,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,OAAO,IAAI,IAAI,kBAAkB,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;;AArBH,wCA2BC;AAJC;;GAEG;AACoB,0BAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 服务装饰器
3
+ * 用于标记实现类对应的接口
4
+ * 使用方式: @Service(IBizA)
5
+ */
6
+ export declare function Service<T = any>(interfaceClass: abstract new () => T): (target: new () => T) => void;
7
+ /**
8
+ * 获取接口类对应的实现类
9
+ */
10
+ export declare function getImplementationClass(interfaceClass: Function): Function | undefined;
11
+ /**
12
+ * 获取实现类对应的接口类
13
+ */
14
+ export declare function getServiceInterface(target: Function): Function;
15
+ //# sourceMappingURL=ServiceToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceToken.d.ts","sourceRoot":"","sources":["../../LightDI/ServiceToken.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,IAClD,QAAQ,UAAU,CAAC,UAOrC;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,CAU9D"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Service = Service;
4
+ exports.getImplementationClass = getImplementationClass;
5
+ exports.getServiceInterface = getServiceInterface;
6
+ /**
7
+ * 服务装饰器元数据的 key
8
+ */
9
+ const SERVICE_INTERFACE_KEY = 'typedi:service:interface';
10
+ /**
11
+ * 接口类到实现类的映射表
12
+ */
13
+ const interfaceToImplementation = new WeakMap();
14
+ /**
15
+ * 服务装饰器
16
+ * 用于标记实现类对应的接口
17
+ * 使用方式: @Service(IBizA)
18
+ */
19
+ function Service(interfaceClass) {
20
+ return function (target) {
21
+ // 将接口类存储到实现类的静态属性中
22
+ target[SERVICE_INTERFACE_KEY] = interfaceClass;
23
+ // 建立接口类到实现类的映射
24
+ interfaceToImplementation.set(interfaceClass, target);
25
+ };
26
+ }
27
+ /**
28
+ * 获取接口类对应的实现类
29
+ */
30
+ function getImplementationClass(interfaceClass) {
31
+ return interfaceToImplementation.get(interfaceClass);
32
+ }
33
+ /**
34
+ * 获取实现类对应的接口类
35
+ */
36
+ function getServiceInterface(target) {
37
+ // 从静态属性获取
38
+ const interfaceClass = target[SERVICE_INTERFACE_KEY];
39
+ if (!interfaceClass) {
40
+ throw new Error(`Cannot find interface class for ${target.name}. ` +
41
+ `Please use @Service(IBizA) decorator on the implementation class.`);
42
+ }
43
+ return interfaceClass;
44
+ }
45
+ //# sourceMappingURL=ServiceToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceToken.js","sourceRoot":"","sources":["../../LightDI/ServiceToken.ts"],"names":[],"mappings":";;AAeA,0BAQC;AAKD,wDAEC;AAKD,kDAUC;AA7CD;;GAEG;AACH,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEzD;;GAEG;AACH,MAAM,yBAAyB,GAAG,IAAI,OAAO,EAAsB,CAAC;AAEpE;;;;GAIG;AACH,SAAgB,OAAO,CAAU,cAAoC;IACnE,OAAO,UAAU,MAAmB;QAClC,mBAAmB;QAClB,MAAc,CAAC,qBAAqB,CAAC,GAAG,cAAc,CAAC;QAExD,eAAe;QACf,yBAAyB,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,cAAwB;IAC7D,OAAO,yBAAyB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,MAAgB;IAClD,UAAU;IACV,MAAM,cAAc,GAAI,MAAc,CAAC,qBAAqB,CAAC,CAAC;IAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,mCAAmC,MAAM,CAAC,IAAI,IAAI;YAClD,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { ILightDIBaseService } from './ILightDIBaseService';
2
+ /**
3
+ * 导出核心类型和接口
4
+ */
5
+ export { ILightDIBaseService } from './ILightDIBaseService';
6
+ export { LightDIManager } from './LightDIManager';
7
+ export { ServiceImpl } from './BaseServiceImpl';
8
+ /**
9
+ * 全局便捷函数
10
+ * 提供简洁的 API 来使用 LightDI
11
+ */
12
+ /**
13
+ * 绑定服务实现类
14
+ * @param ImplClass 服务实现类
15
+ * @param key 可选的服务键,默认为 'default'
16
+ */
17
+ export declare function bind<T extends ILightDIBaseService>(ImplClass: new () => T, key?: string): void;
18
+ /**
19
+ * 获取服务实例
20
+ * @param InterfaceClass 接口类
21
+ * @param key 可选的服务键,默认为 'default'
22
+ */
23
+ export declare function getService<T extends ILightDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
24
+ /**
25
+ * 清除所有服务实例(主要用于测试)
26
+ */
27
+ export declare function clear(): void;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../LightDI/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,mBAAmB,EAChD,SAAS,EAAE,UAAU,CAAC,EACtB,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,mBAAmB,EACtD,cAAc,EAAE,QAAQ,WAAW,CAAC,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAEH;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAE5B"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceImpl = exports.LightDIManager = exports.ILightDIBaseService = void 0;
4
+ exports.bind = bind;
5
+ exports.getService = getService;
6
+ exports.clear = clear;
7
+ const LightDIManager_1 = require("./LightDIManager");
8
+ /**
9
+ * 导出核心类型和接口
10
+ */
11
+ var ILightDIBaseService_1 = require("./ILightDIBaseService");
12
+ Object.defineProperty(exports, "ILightDIBaseService", { enumerable: true, get: function () { return ILightDIBaseService_1.ILightDIBaseService; } });
13
+ var LightDIManager_2 = require("./LightDIManager");
14
+ Object.defineProperty(exports, "LightDIManager", { enumerable: true, get: function () { return LightDIManager_2.LightDIManager; } });
15
+ var BaseServiceImpl_1 = require("./BaseServiceImpl");
16
+ Object.defineProperty(exports, "ServiceImpl", { enumerable: true, get: function () { return BaseServiceImpl_1.ServiceImpl; } });
17
+ /**
18
+ * 全局便捷函数
19
+ * 提供简洁的 API 来使用 LightDI
20
+ */
21
+ /**
22
+ * 绑定服务实现类
23
+ * @param ImplClass 服务实现类
24
+ * @param key 可选的服务键,默认为 'default'
25
+ */
26
+ function bind(ImplClass, key) {
27
+ LightDIManager_1.LightDIManager.getInstance().bind(ImplClass, key);
28
+ }
29
+ /**
30
+ * 获取服务实例
31
+ * @param InterfaceClass 接口类
32
+ * @param key 可选的服务键,默认为 'default'
33
+ */
34
+ function getService(InterfaceClass, key) {
35
+ return LightDIManager_1.LightDIManager.getInstance().getService(InterfaceClass, key);
36
+ }
37
+ /**
38
+ * 清除所有服务实例(主要用于测试)
39
+ */
40
+ function clear() {
41
+ LightDIManager_1.LightDIManager.getInstance().clear();
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../LightDI/index.ts"],"names":[],"mappings":";;;AAoBA,oBAKC;AAOD,gCAKC;AAKD,sBAEC;AA5CD,qDAAkD;AAGlD;;GAEG;AACH,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,qDAAgD;AAAvC,8GAAA,WAAW,OAAA;AAEpB;;;GAGG;AAEH;;;;GAIG;AACH,SAAgB,IAAI,CAClB,SAAsB,EACtB,GAAY;IAEZ,+BAAc,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CACxB,cAAoC,EACpC,GAAY;IAEZ,OAAO,+BAAc,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK;IACnB,+BAAc,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AACvC,CAAC"}
@@ -1,8 +1,7 @@
1
- import 'reflect-metadata';
2
- import { ITypeDIBaseService } from './ITypeDIBaseService';
1
+ import { ILightDIBaseService } from './ILightDIBaseService';
3
2
  /**
4
3
  * 服务实现装饰器
5
- * 自动设置 TypeDI 相关的静态属性和方法
4
+ * 自动设置 LightDI 相关的静态属性和方法
6
5
  *
7
6
  * 使用方式:
8
7
  * @ServiceImpl(IBizA)
@@ -10,5 +9,5 @@ import { ITypeDIBaseService } from './ITypeDIBaseService';
10
9
  * // 实现接口方法
11
10
  * }
12
11
  */
13
- export declare function ServiceImpl<T extends ITypeDIBaseService>(interfaceClass: abstract new () => T): <U extends new () => T>(target: U) => U;
12
+ export declare function ServiceImpl<T extends ILightDIBaseService>(interfaceClass: abstract new () => T): <U extends new () => T>(target: U) => U;
14
13
  //# sourceMappingURL=BaseServiceImpl.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"BaseServiceImpl.d.ts","sourceRoot":"","sources":["../../TypeDI/BaseServiceImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,mBAAmB,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,IAC5E,CAAC,SAAS,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAG,CAAC,CAiBtD"}
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ServiceImpl = ServiceImpl;
4
- require("reflect-metadata");
5
4
  const ServiceToken_1 = require("./ServiceToken");
6
5
  /**
7
6
  * 服务实现装饰器
8
- * 自动设置 TypeDI 相关的静态属性和方法
7
+ * 自动设置 LightDI 相关的静态属性和方法
9
8
  *
10
9
  * 使用方式:
11
10
  * @ServiceImpl(IBizA)