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 +104 -0
- package/README.md +13 -22
- package/dist/TypeDI/BaseServiceImpl.d.ts +3 -4
- package/dist/TypeDI/BaseServiceImpl.d.ts.map +1 -1
- package/dist/TypeDI/BaseServiceImpl.js +1 -2
- package/dist/TypeDI/BaseServiceImpl.js.map +1 -1
- package/dist/TypeDI/ILightDIBaseService.d.ts +7 -0
- package/dist/TypeDI/ILightDIBaseService.d.ts.map +1 -0
- package/dist/TypeDI/ILightDIBaseService.js +11 -0
- package/dist/TypeDI/ILightDIBaseService.js.map +1 -0
- package/dist/TypeDI/ILightDIManager.d.ts +23 -0
- package/dist/TypeDI/ILightDIManager.d.ts.map +1 -0
- package/dist/TypeDI/ILightDIManager.js +3 -0
- package/dist/TypeDI/ILightDIManager.js.map +1 -0
- package/dist/TypeDI/LightDIManager.d.ts +54 -0
- package/dist/TypeDI/LightDIManager.d.ts.map +1 -0
- package/dist/TypeDI/LightDIManager.js +132 -0
- package/dist/TypeDI/LightDIManager.js.map +1 -0
- package/dist/TypeDI/ServiceToken.d.ts +2 -51
- package/dist/TypeDI/ServiceToken.d.ts.map +1 -1
- package/dist/TypeDI/ServiceToken.js +8 -88
- package/dist/TypeDI/ServiceToken.js.map +1 -1
- package/dist/TypeDI/index.d.ts +12 -13
- package/dist/TypeDI/index.d.ts.map +1 -1
- package/dist/TypeDI/index.js +24 -10
- package/dist/TypeDI/index.js.map +1 -1
- package/dist/src/index.d.ts +3 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -14
- package/dist/src/index.js.map +1 -1
- 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
|
|
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
|
-
|
|
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
|
-
###
|
|
23
|
+
### 2. ManagerProvider 自动创建
|
|
27
24
|
如果 `getService` 找不到实例,会自动调用实现类的 `ManagerProvider()` 方法创建实例并缓存,**无需手动 new 实现类**。
|
|
28
25
|
|
|
29
26
|
## 使用要求
|
|
30
27
|
|
|
31
28
|
### 接口文件 (IxxxService.ts)
|
|
32
|
-
- 继承 `
|
|
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 {
|
|
43
|
+
import { ILightDIBaseService } from 'light-di';
|
|
48
44
|
|
|
49
|
-
|
|
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 '
|
|
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
|
-
|
|
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>(
|
|
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 '
|
|
2
|
-
import { ITypeDIBaseService } from './ITypeDIBaseService';
|
|
1
|
+
import { ILightDIBaseService } from './ILightDIBaseService';
|
|
3
2
|
/**
|
|
4
3
|
* 服务实现装饰器
|
|
5
|
-
* 自动设置
|
|
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
|
|
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,
|
|
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
|
-
* 自动设置
|
|
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":";;
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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 =
|
|
119
|
-
if (interfaceClass) {
|
|
120
|
-
|
|
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":"
|
|
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"}
|
package/dist/TypeDI/index.d.ts
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
import '
|
|
2
|
-
|
|
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 来使用
|
|
10
|
+
* 提供简洁的 API 来使用 LightDI
|
|
6
11
|
*/
|
|
7
12
|
/**
|
|
8
|
-
*
|
|
9
|
-
* @param
|
|
13
|
+
* 绑定服务实现类
|
|
14
|
+
* @param ImplClass 服务实现类
|
|
10
15
|
* @param key 可选的服务键,默认为 'default'
|
|
11
16
|
*/
|
|
12
|
-
export declare function bind<T extends
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/TypeDI/index.js
CHANGED
|
@@ -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("
|
|
7
|
-
|
|
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 来使用
|
|
19
|
+
* 提供简洁的 API 来使用 LightDI
|
|
11
20
|
*/
|
|
12
21
|
/**
|
|
13
|
-
*
|
|
14
|
-
* @param
|
|
22
|
+
* 绑定服务实现类
|
|
23
|
+
* @param ImplClass 服务实现类
|
|
15
24
|
* @param key 可选的服务键,默认为 'default'
|
|
16
25
|
*/
|
|
17
|
-
function bind(
|
|
18
|
-
|
|
26
|
+
function bind(ImplClass, key) {
|
|
27
|
+
LightDIManager_1.LightDIManager.getInstance().bind(ImplClass, key);
|
|
19
28
|
}
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
41
|
+
LightDIManager_1.LightDIManager.getInstance().clear();
|
|
28
42
|
}
|
|
29
43
|
//# sourceMappingURL=index.js.map
|
package/dist/TypeDI/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../TypeDI/index.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
* LightDI - TypeScript 依赖注入框架
|
|
3
3
|
* 主入口文件,导出所有公共 API
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,
|
|
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.
|
|
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
|
|
12
|
-
Object.defineProperty(exports, "
|
|
9
|
+
var ILightDIBaseService_1 = require("../TypeDI/ILightDIBaseService");
|
|
10
|
+
Object.defineProperty(exports, "ILightDIBaseService", { enumerable: true, get: function () { return ILightDIBaseService_1.ILightDIBaseService; } });
|
|
13
11
|
// 导出管理器
|
|
14
|
-
var
|
|
15
|
-
Object.defineProperty(exports, "
|
|
16
|
-
Object.defineProperty(exports, "
|
|
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
|
// 导出全局便捷函数
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,
|
|
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.
|
|
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/
|
|
30
|
+
"url": "https://github.com/SourceKim/light-di.git"
|
|
32
31
|
},
|
|
33
32
|
"bugs": {
|
|
34
|
-
"url": "https://github.com/SourceKim/
|
|
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
|
-
|