light-di 1.0.0 → 1.2.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.
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
  ```
@@ -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)
@@ -1 +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"}
1
+ {"version":3,"file":"BaseServiceImpl.js","sourceRoot":"","sources":["../../TypeDI/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":["../../TypeDI/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":["../../TypeDI/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":["../../TypeDI/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":["../../TypeDI/ILightDIManager.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
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
+ * 通过 ManagerProvider 创建实例
26
+ * @param InterfaceClass 接口类
27
+ * @param key 服务键
28
+ * @returns 服务实例或 null
29
+ */
30
+ private createInstanceViaProvider;
31
+ /**
32
+ * 清除所有服务实例(主要用于测试)
33
+ */
34
+ clear(): void;
35
+ }
36
+ /**
37
+ * LightDI 管理器单例
38
+ */
39
+ export declare class LightDIManager {
40
+ private static instance;
41
+ /**
42
+ * 初始化管理器(应在应用启动时调用一次)
43
+ */
44
+ static init(manager?: ILightDIManager): ILightDIManager;
45
+ /**
46
+ * 获取单例实例(如果未初始化则自动初始化)
47
+ */
48
+ static getInstance(): ILightDIManager;
49
+ /**
50
+ * 默认 key 常量
51
+ */
52
+ static readonly DEFAULT_KEY = "default";
53
+ }
54
+ //# sourceMappingURL=LightDIManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightDIManager.d.ts","sourceRoot":"","sources":["../../TypeDI/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;IAyBJ;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAiCjC;;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,132 @@
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
+ // 如果找不到实例,尝试通过 ManagerProvider 创建
58
+ const instance = this.createInstanceViaProvider(InterfaceClass, actualKey);
59
+ if (instance) {
60
+ return instance;
61
+ }
62
+ // 如果还是找不到,抛出错误
63
+ throw new Error(`Service instance not found for ${InterfaceClass.name} with key "${actualKey}"`);
64
+ }
65
+ /**
66
+ * 通过 ManagerProvider 创建实例
67
+ * @param InterfaceClass 接口类
68
+ * @param key 服务键
69
+ * @returns 服务实例或 null
70
+ */
71
+ createInstanceViaProvider(InterfaceClass, key) {
72
+ // 从实现类获取静态 ManagerProvider 方法
73
+ const ImplementationClass = (0, ServiceToken_1.getImplementationClass)(InterfaceClass);
74
+ if (ImplementationClass) {
75
+ const StaticImplClass = ImplementationClass;
76
+ if (StaticImplClass.ManagerProvider &&
77
+ typeof StaticImplClass.ManagerProvider === 'function') {
78
+ const instance = StaticImplClass.ManagerProvider();
79
+ // 将创建的实例存储到服务映射中(使用 default key)
80
+ if (!this.services.has(InterfaceClass)) {
81
+ this.services.set(InterfaceClass, new Map());
82
+ }
83
+ const serviceMap = this.services.get(InterfaceClass);
84
+ serviceMap.set(LightDIManagerImpl.DEFAULT_KEY, instance);
85
+ // 如果请求的 key 不是 default,也存储一份
86
+ if (key !== LightDIManagerImpl.DEFAULT_KEY) {
87
+ serviceMap.set(key, instance);
88
+ }
89
+ return instance;
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ /**
95
+ * 清除所有服务实例(主要用于测试)
96
+ */
97
+ clear() {
98
+ this.services.clear();
99
+ }
100
+ }
101
+ exports.LightDIManagerImpl = LightDIManagerImpl;
102
+ // 默认 key
103
+ LightDIManagerImpl.DEFAULT_KEY = 'default';
104
+ /**
105
+ * LightDI 管理器单例
106
+ */
107
+ class LightDIManager {
108
+ /**
109
+ * 初始化管理器(应在应用启动时调用一次)
110
+ */
111
+ static init(manager) {
112
+ if (!LightDIManager.instance) {
113
+ LightDIManager.instance = manager || new LightDIManagerImpl();
114
+ }
115
+ return LightDIManager.instance;
116
+ }
117
+ /**
118
+ * 获取单例实例(如果未初始化则自动初始化)
119
+ */
120
+ static getInstance() {
121
+ if (!LightDIManager.instance) {
122
+ return LightDIManager.init();
123
+ }
124
+ return LightDIManager.instance;
125
+ }
126
+ }
127
+ exports.LightDIManager = LightDIManager;
128
+ /**
129
+ * 默认 key 常量
130
+ */
131
+ LightDIManager.DEFAULT_KEY = LightDIManagerImpl.DEFAULT_KEY;
132
+ //# sourceMappingURL=LightDIManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightDIManager.js","sourceRoot":"","sources":["../../TypeDI/LightDIManager.ts"],"names":[],"mappings":"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"}
@@ -1,58 +1,9 @@
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
1
  /**
51
2
  * 服务装饰器
52
3
  * 用于标记实现类对应的接口
53
4
  * 使用方式: @Service(IBizA)
54
5
  */
55
- export declare function Service<T extends any>(interfaceClass: abstract new () => T): (target: new () => T) => void;
6
+ export declare function Service<T = any>(interfaceClass: abstract new () => T): (target: new () => T) => void;
56
7
  /**
57
8
  * 获取接口类对应的实现类
58
9
  */
@@ -60,5 +11,5 @@ export declare function getImplementationClass(interfaceClass: Function): Functi
60
11
  /**
61
12
  * 获取实现类对应的接口类
62
13
  */
63
- export declare function getServiceInterface(target: Function): Function | undefined;
14
+ export declare function getServiceInterface(target: Function): Function;
64
15
  //# sourceMappingURL=ServiceToken.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"ServiceToken.d.ts","sourceRoot":"","sources":["../../TypeDI/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"}
@@ -1,86 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ServiceRegistry = exports.ServiceToken = void 0;
4
- exports.ServiceInterface = ServiceInterface;
5
- exports.getServiceInterfaceByName = getServiceInterfaceByName;
6
3
  exports.Service = Service;
7
4
  exports.getImplementationClass = getImplementationClass;
8
5
  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
6
  /**
85
7
  * 服务装饰器元数据的 key
86
8
  */
@@ -96,10 +18,8 @@ const interfaceToImplementation = new WeakMap();
96
18
  */
97
19
  function Service(interfaceClass) {
98
20
  return function (target) {
99
- // 将接口类存储到实现类的元数据中
100
- Reflect.defineMetadata(SERVICE_INTERFACE_KEY, interfaceClass, target);
101
- // 同时在实现类上设置静态属性(作为备用方案)
102
- target.__interface__ = interfaceClass;
21
+ // 将接口类存储到实现类的静态属性中
22
+ target[SERVICE_INTERFACE_KEY] = interfaceClass;
103
23
  // 建立接口类到实现类的映射
104
24
  interfaceToImplementation.set(interfaceClass, target);
105
25
  };
@@ -114,12 +34,12 @@ function getImplementationClass(interfaceClass) {
114
34
  * 获取实现类对应的接口类
115
35
  */
116
36
  function getServiceInterface(target) {
117
- // 首先尝试从元数据获取
118
- const interfaceClass = Reflect.getMetadata(SERVICE_INTERFACE_KEY, target);
119
- if (interfaceClass) {
120
- return interfaceClass;
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.`);
121
42
  }
122
- // 备用方案:从静态属性获取
123
- return target.__interface__;
43
+ return interfaceClass;
124
44
  }
125
45
  //# sourceMappingURL=ServiceToken.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceToken.js","sourceRoot":"","sources":["../../TypeDI/ServiceToken.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ServiceToken.js","sourceRoot":"","sources":["../../TypeDI/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"}
@@ -1,27 +1,26 @@
1
- import 'reflect-metadata';
2
- import { ITypeDIBaseService } from './ITypeDIBaseService';
1
+ import { ILightDIBaseService } from './ILightDIBaseService';
2
+ /**
3
+ * 导出核心类型和接口
4
+ */
5
+ export { ILightDIBaseService } from './ILightDIBaseService';
6
+ export { LightDIManager } from './LightDIManager';
7
+ export { ServiceImpl } from './BaseServiceImpl';
3
8
  /**
4
9
  * 全局便捷函数
5
- * 提供简洁的 API 来使用 TypeDI
10
+ * 提供简洁的 API 来使用 LightDI
6
11
  */
7
12
  /**
8
- * 绑定服务实例
9
- * @param instance 服务实例
13
+ * 绑定服务实现类
14
+ * @param ImplClass 服务实现类
10
15
  * @param key 可选的服务键,默认为 'default'
11
16
  */
12
- export declare function bind<T extends ITypeDIBaseService>(instance: T, key?: string): void;
17
+ export declare function bind<T extends ILightDIBaseService>(ImplClass: new () => T, key?: string): void;
13
18
  /**
14
19
  * 获取服务实例
15
20
  * @param InterfaceClass 接口类
16
21
  * @param key 可选的服务键,默认为 'default'
17
22
  */
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;
23
+ export declare function getService<T extends ILightDIBaseService>(InterfaceClass: abstract new () => T, key?: string): T;
25
24
  /**
26
25
  * 清除所有服务实例(主要用于测试)
27
26
  */
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../TypeDI/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"}
@@ -1,29 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceImpl = exports.LightDIManager = exports.ILightDIBaseService = void 0;
3
4
  exports.bind = bind;
4
5
  exports.getService = getService;
5
6
  exports.clear = clear;
6
- require("reflect-metadata");
7
- const TypeDIManager_1 = require("./TypeDIManager");
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; } });
8
17
  /**
9
18
  * 全局便捷函数
10
- * 提供简洁的 API 来使用 TypeDI
19
+ * 提供简洁的 API 来使用 LightDI
11
20
  */
12
21
  /**
13
- * 绑定服务实例
14
- * @param instance 服务实例
22
+ * 绑定服务实现类
23
+ * @param ImplClass 服务实现类
15
24
  * @param key 可选的服务键,默认为 'default'
16
25
  */
17
- function bind(instance, key) {
18
- TypeDIManager_1.TypeDIManager.getInstance().bind(instance, key);
26
+ function bind(ImplClass, key) {
27
+ LightDIManager_1.LightDIManager.getInstance().bind(ImplClass, key);
19
28
  }
20
- function getService(InterfaceClassOrName, key) {
21
- return TypeDIManager_1.TypeDIManager.getInstance().getService(InterfaceClassOrName, key);
29
+ /**
30
+ * 获取服务实例
31
+ * @param InterfaceClass 接口类
32
+ * @param key 可选的服务键,默认为 'default'
33
+ */
34
+ function getService(InterfaceClass, key) {
35
+ return LightDIManager_1.LightDIManager.getInstance().getService(InterfaceClass, key);
22
36
  }
23
37
  /**
24
38
  * 清除所有服务实例(主要用于测试)
25
39
  */
26
40
  function clear() {
27
- TypeDIManager_1.TypeDIManager.getInstance().clear();
41
+ LightDIManager_1.LightDIManager.getInstance().clear();
28
42
  }
29
43
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../TypeDI/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"}
@@ -2,11 +2,9 @@
2
2
  * LightDI - TypeScript 依赖注入框架
3
3
  * 主入口文件,导出所有公共 API
4
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';
5
+ export { ILightDIBaseService } from '../TypeDI/ILightDIBaseService';
6
+ export { ILightDIManager } from '../TypeDI/ILightDIManager';
7
+ export { LightDIManager, LightDIManagerImpl } from '../TypeDI/LightDIManager';
10
8
  export { ServiceImpl } from '../TypeDI/BaseServiceImpl';
11
9
  export { bind, getService, clear } from '../TypeDI/index';
12
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/src/index.js CHANGED
@@ -4,23 +4,15 @@
4
4
  * 主入口文件,导出所有公共 API
5
5
  */
6
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");
7
+ exports.clear = exports.getService = exports.bind = exports.ServiceImpl = exports.LightDIManagerImpl = exports.LightDIManager = exports.ILightDIBaseService = void 0;
10
8
  // 导出核心类型和接口
11
- var ITypeDIBaseService_1 = require("../TypeDI/ITypeDIBaseService");
12
- Object.defineProperty(exports, "ITypeDIBaseService", { enumerable: true, get: function () { return ITypeDIBaseService_1.ITypeDIBaseService; } });
9
+ var ILightDIBaseService_1 = require("../TypeDI/ILightDIBaseService");
10
+ Object.defineProperty(exports, "ILightDIBaseService", { enumerable: true, get: function () { return ILightDIBaseService_1.ILightDIBaseService; } });
13
11
  // 导出管理器
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; } });
12
+ var LightDIManager_1 = require("../TypeDI/LightDIManager");
13
+ Object.defineProperty(exports, "LightDIManager", { enumerable: true, get: function () { return LightDIManager_1.LightDIManager; } });
14
+ Object.defineProperty(exports, "LightDIManagerImpl", { enumerable: true, get: function () { return LightDIManager_1.LightDIManagerImpl; } });
17
15
  // 导出装饰器和工具函数
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
16
  var BaseServiceImpl_1 = require("../TypeDI/BaseServiceImpl");
25
17
  Object.defineProperty(exports, "ServiceImpl", { enumerable: true, get: function () { return BaseServiceImpl_1.ServiceImpl; } });
26
18
  // 导出全局便捷函数
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,YAAY;AACZ,qEAAoE;AAA3D,0HAAA,mBAAmB,OAAA;AAG5B,QAAQ;AACR,2DAA8E;AAArE,gHAAA,cAAc,OAAA;AAAE,oHAAA,kBAAkB,OAAA;AAE3C,aAAa;AACb,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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "light-di",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "LightDI - TypeScript Dependency Injection Framework - 服务之间只通过接口依赖,实现解耦",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -21,22 +21,19 @@
21
21
  "di",
22
22
  "ioc",
23
23
  "inversion-of-control",
24
- "decorator",
25
- "reflect-metadata"
24
+ "decorator"
26
25
  ],
27
26
  "author": "",
28
27
  "license": "MIT",
29
28
  "repository": {
30
29
  "type": "git",
31
- "url": "https://github.com/SourceKim/EasyDI.git"
30
+ "url": "https://github.com/SourceKim/light-di.git"
32
31
  },
33
32
  "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"
33
+ "url": "https://github.com/SourceKim/light-di/issues"
39
34
  },
35
+ "homepage": "https://github.com/SourceKim/light-di#readme",
36
+ "dependencies": {},
40
37
  "devDependencies": {
41
38
  "@types/node": "^20.0.0",
42
39
  "ts-node": "^10.9.0",
@@ -49,4 +46,3 @@
49
46
  "node": ">=14.0.0"
50
47
  }
51
48
  }
52
-